¿Cuál es la forma correcta de incremento de java.util.Fecha por un día.

Estoy pensando en algo como

        Calendar cal = Calendar.getInstance();
        cal.setTime(toDate);
        cal.add(Calendar.DATE, 1);
        toDate = cal.getTime();

No «sentir» a la derecha.

  • esto parece correcto, yo no reutilizar toDate me gustaría tener una nueva variable denominada nextDate, dayAfterToDate o algo más explícito y auto explicativo
  • lollipop, buen punto.
  • Se ve mal, porque parece que lo está modificando un compartida singleton valor para añadir un día a una fecha. Pero el javadoc de getInstance() dice: «Coge un calendario utilizando el valor predeterminado de la zona horaria y la configuración regional. El Calendario devuelto es basado en la hora actual en la zona horaria predeterminada con la configuración regional predeterminada.» Por lo que es en realidad un nuevo Calendario que se retruned. Java 1.8 LocalDateTime es mucho mejor aplicación, pero tal vez esto ayude a alguien (más) condenados a ajustar alguien Java 1.6.
InformationsquelleAutor Anthony | 2010-09-28

8 Comentarios

  1. 19

    Que iba a funcionar.

    No «sentir» a la derecha.

    Si es que el nivel de detalle que molesta, bienvenido a Java fecha de la API de tiempo 🙂

  2. 19

    Si no te gustan las matemáticas en la solución de Tony Ennis

    Date someDate = new Date(); //Or whatever
    Date dayAfter = new Date(someDate.getTime() + TimeUnit.DAYS.toMillis( 1 ));

    Pero más o menos desde que encontré este P/A, he estado usando JodaTime, en su lugar, y han cambiado recientemente a la nueva DateTime en Java 8 (que inspirado por el, pero no se copian de Joda gracias @BasilBourqueless para señalar esto).

    Java 8

    En Java 8, casi todos basados en el tiempo de las clases tienen un .plusDays() método de hacer esta tarea trivial:

    LocalDateTime.now()  .plusDays(1);
    LocalDate.now()      .plusDays(1);
    ZonedDateTime.now()  .plusDays(1);
    Duration.ofDays(1)   .plusDays(1);
    Period.ofYears(1)    .plusDays(1);
    OffsetTime.now()     .plus(1, ChronoUnit.DAYS);
    OffsetDateTime.now() .plus(1, ChronoUnit.DAYS);
    Instant.now()        .plus(1, ChronoUnit.DAYS);

    Java 8 también añade clases y métodos para interoperar entre el (ahora) el legado de la Fecha y el Calendario, etc. y el new DateTime clases, que son sin duda la mejor opción para todos los nuevos desarrollos.

  3. 11

    Sí, eso es correcto. Java Fecha de Api siento mal muy a menudo. Te recomiendo que pruebes Joda Tiempo. Sería algo así como:

    DateTime startDate = ...
    DateTime endDate = startDate.plusDays(1);

    o:

    Instant start = ...
    Instant end = start.plus(Days.days(1).toStandardDuration());
    • +1 para el sentimiento
    • Absolutamente! No me gusta la fecha de la aritmética en java.util.Fecha tanto que en mi actual yo aislado en un conjunto de 6-8 métodos. Esto estaba bien, pero después me encontré Joda Tiempo estos métodos se convirtió en 1-2 revestimientos de y una pareja ganó incluso un poco en la generalidad.
  4. 9

    He aquí cómo lo hago:

    Date someDate = new Date(); //Or whatever    
    Date dayAfter = new Date(someDate.getTime()+(24*60*60*1000));

    Donde la matemática al final se convierte de un día de pena de segundos a milisegundos.

    • ¿Por qué el -1? El número de horas, minutos y segundos es poco probable que cambie en cualquier momento pronto.
    • para una cosa, esto no toma en cuenta el Calendario cosas como año bisiesto y los segundos intercalares y otras minucias, este es el motivo por el equivalente a los métodos de Date() están en desuso y Calendario, y GregorianCalendar existir en primer lugar. Y su código de no manejar el horario de verano cualquiera, ingenuo, una fuente interminable de thedailyWTF artículos y errores en el peor.
  5. 3

    Si Java 8 o Joda el Tiempo no son una opción, siempre se puede optar por Apache DateUtils:

    DateUtils.addDays(myDate, 1);
  6. 0
    Date thisDate = new Date(System.currentTimeMillis());
    
    Date dayAfter = new Date(thisDate.getTime() + TimeUnit.DAYS.toMillis( 1 ));
    
    Date dayBefore = new Date(thisDate.getTime() + TimeUnit.DAYS.toMillis( -1 ));
    • No toma en cuenta, que un día de vez en cuando puede ser 23 horas, 25 horas o algunos otros de longitud. También no entiendo por qué alguien querría usar el mal diseñado y largo obsoletos Date clase en 2019.
    • alguien desarrolla o apoya el software que está escrito en la versión anterior de Java
  7. 0

    Yo estoy contribuyendo a la respuesta moderna.

    No «sentir» a la derecha.

    Mi sugerencia es que ¿por qué no se siente bien es porque es tan detallado. La adición de un día a la fecha es conceptualmente simple y debe tener una simple representación en su programa. El problema aquí es el mal diseño de la Calendar clase: cuando se utiliza, el código necesita ser este detallado. Y estás en lo correcto: debe no utilice el mal diseñado Calendar clase. Es largo obsoletos. El uso de java.tiempo, la moderna Java fecha y la hora de la API, la adición de un día es simple, también en código:

        LocalDate toDate = LocalDate.of(2020, Month.FEBRUARY, 28);
        LocalDate nextDate = toDate.plusDays(1);
        System.out.println("Incremented date is " + nextDate);

    La salida es:

    Incrementa la fecha es 2020-02-29

    En caso de que su necesidad es de un tipo diferente de LocalDate, otros de java.el tiempo de clases también tienen un plusDays método que puede utilizar de la misma manera, como ya se ha demostrado en la respuesta por Ivin.

    Enlaces

Dejar respuesta

Please enter your comment!
Please enter your name here