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.*
).