zona with specific obtener mexico horaria create convert change java java-8 jodatime date-difference jsr310

with - timezone java



Joda Time y Java8 Diferencia horaria (1)

Estoy buscando una solución para calcular los meses entre dos fechas. Creo que el tiempo de joda o java8 puede hacerlo. Pero cuando los comparo encontré algo realmente extraño.

import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.Date; import org.joda.time.Months; public class DateMain { public static void main(String[] args) throws ParseException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date d1 = simpleDateFormat.parse("2017-01-28 00:00:00.000"); Date d2 = simpleDateFormat.parse("2017-02-28 00:00:00.000"); System.out.println("Test Cast 1"); System.out.println("joda time api result: " + monthsBetweenJoda(d1, d2) + " month"); System.out.println("java8 time api result: " + monthsBetweenJava8(d1, d2) + " month"); Date dd1 = simpleDateFormat.parse("2017-01-29 00:00:00.000"); Date dd2 = simpleDateFormat.parse("2017-02-28 00:00:00.000"); System.out.println("Test Cast 2"); System.out.println("joda time api result: " + monthsBetweenJoda(dd1, dd2) + " month"); System.out.println("java8 time api result: " + monthsBetweenJava8(dd1, dd2) + " month"); } public static int monthsBetweenJoda(Date fromDate, Date toDate) { if (fromDate == null || toDate == null) { throw new IllegalArgumentException(); } org.joda.time.LocalDateTime fromLocalDateTime = org.joda.time.LocalDateTime .fromDateFields(fromDate); org.joda.time.LocalDateTime toLocalDateTime = org.joda.time.LocalDateTime .fromDateFields(toDate); Months months = Months.monthsBetween(fromLocalDateTime, toLocalDateTime); return months.getMonths(); } public static long monthsBetweenJava8(Date fromDate, Date toDate) { if (fromDate == null || toDate == null) { throw new IllegalArgumentException(); } LocalDateTime ldt1 = fromDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); LocalDateTime ldt2 = toDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); return ChronoUnit.MONTHS.between(ldt1, ldt2); } }

la salida es a continuación:

Test Cast 1 joda time api result: 1 month java8 time api result: 1 month Test Cast 2 joda time api result: 1 month java8 time api result: 0 month

Me siento muy confundido con el caso de prueba 2, y cuál es razonable?

Lo siento, es mi primera pregunta aquí. Código completado adjunto.


Joda-Time y Java 8 java.time.* Tienen diferentes algoritmos para determinar el número de meses entre.

java.time.* solo declara que un mes ha pasado una vez que el día del mes es mayor (o en el próximo mes). Desde el 2017-02-28 hasta el 2017-02-28 está claro que el segundo día del mes (28) es menor que el primero (29), por lo que aún no se ha completado un mes.

Joda-Time declara que ha pasado un mes porque agregar 1 mes al 2017-01-29 dará como resultado el 2017-02-28 .

Ambos son algoritmos plausibles, pero creo que el algoritmo java.time.* más en sintonía con lo que la gente espera (por eso elegí un algoritmo diferente al escribir java.time.* ).