29 votes

Décalage horaire Joda et Java8

Je recherche une solution pour calculer les mois entre deux dates. Je pense que le temps joda ou java8 peut le faire. Mais quand je les compare, j'ai trouvé quelque chose de vraiment bizarre.

 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 sortie est ci-dessous:

 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
 

Je me sens très confus avec le cas de test 2, et lequel est raisonnable?

Désolé, c'est ma première question ici. Code complété joint.

38voto

JodaStephen Points 6357

Joda-Time et Java 8 java.time.* ont différents algorithmes pour déterminer le nombre de mois entre.

java.time.* ne déclare qu'un mois s'est écoulé une fois le jour du mois est supérieur (ou dans le mois suivant). D' 2017-01-29 de 2017-02-28 il est clair que le deuxième jour du mois (28) est inférieure à la première (29) donc un mois n'a pas encore été achevée.

Joda-Time déclare un mois est passé, parce que l'ajout de 1 mois à l' 2017-01-29 rendement 2017-02-28.

Les deux sont plausibles algorithmes, mais je crois que l' java.time.* algorithme pour être plus en phase avec ce que les gens attendent (c'est pourquoi j'ai choisi un algorithme différent lors de l'écriture d' java.time.*).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X