Comment trouver la différence entre deux DateTimes Joda-Time en quelques minutes

141

Voici la méthode que j'ai écrite:

public List<Map<String, Object>> loadNotYetInEmployee(int shift, Date date,
        int transitionVal, String type, User user) {

    DateTime datetime = new DateTime(date);
    datetime = datetime
            .plus(Period.minutes(shiftTiming.getSession1InTime()));

    List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

    sql = SqlMapUtils.getSql("attendance.attendancestatus.latein",
            parameters);
    result = getJdbcTemplate().queryForList(sql);
    for (int i = 0; i < result.size(); i++) {
        Date punchInTime = (Date) result.get(i).get("punchtime");
        DateTime punchTime = new DateTime(punchInTime);
    }
    return result;
}

Maintenant, à partir de ma méthode, vous pouvez voir que j'ai un objet Joda-Time DateTime dans l'objet nommé datetimeet à partir de mon résultat, j'obtiens un horodatage que je convertis en jodatime punchTime. Maintenant, je veux connaître la différence entre ces deux dates, comment faire?

Deepak Kumar
la source
9
Minutes # minutesBetween est votre ami.
Luiggi Mendoza
2
Mais cela ne fonctionnera que si vos objets DateTime sont dans le même TimeZone.
Tiago
1
Days.daysBetween(d1, d2)est le voisin de votre ami
Shubham Chaudhary

Réponses:

79

Cela vous permettra de faire la différence entre deux objets DateTime en millisecondes:

DateTime d1 = new DateTime();
DateTime d2 = new DateTime();

long diffInMillis = d2.getMillis() - d1.getMillis();
Alfredaday
la source
78
La réponse de MadProgrammer aurait dû être la réponse acceptée. Remarquez l'utilisation simple de Minutes.minutesBetween.
Basil Bourque
5
Non, je ne suis pas d'accord, c'est trop verbeux et peu clair: "Les minutes minutes entre l'heure du poinçon et l'heure de la date" est pire que "la deuxième date millisecondes moins la première date millisecondes"
Jonathan Neufeld
4
Cela ne tiendra pas compte de l'heure d'été.
Sander Versluys
454

Quelque chose comme...

DateTime today = new DateTime();
DateTime yesterday = today.minusDays(1);

Duration duration = new Duration(yesterday, today);
System.out.println(duration.getStandardDays());
System.out.println(duration.getStandardHours());
System.out.println(duration.getStandardMinutes());

Quelles sorties

1
24
1440

ou

System.out.println(Minutes.minutesBetween(yesterday, today).getMinutes());

Ce qui est probablement plus ce que vous recherchez

MadProgrammer
la source
Est-ce que ce qui précède prend en compte les fuseaux horaires? Ou devrais-je commencer par convertir en UTC / GMT?
Doo Dah
@DooDah C'est une bonne question, je "crois" qu'elle le fait (comme JodaTime a le concept de LocalTime), mais je vous suggère de la tester et de voir. La question serait cependant, dans quel fuseau horaire la valeur résultante serait-elle représentée?
MadProgrammer
Je vais tester et comprendre cela. Pour moi, le fuseau horaire résultant sera probablement le serveur sur lequel le code s'exécute. J'implémente une file d'attente planifiée et devra calculer la durée entre maintenant et une heure future en fonction d'une date d'un autre fuseau horaire. Je rapporterai ce que je trouve.
Doo Dah
2
Je suis d'accord, cela aurait dû être la réponse choisie. C'est soigné et simple.
Sid
Créer un nouvel objet Duration juste pour obtenir un décalage horaire n'est tout simplement pas cool. Imaginez devoir effectuer un décalage horaire sur un large éventail d'objets date / heure.
AndroidDev
7

Quelque chose comme...

Minutes.minutesBetween(getStart(), getEnd()).getMinutes();
Carlos Chaguendo
la source
Échoue si les dates de début et de fin sont vraiment éloignées (supérieures à la taille de int)
dannyRods
3
DateTime d1 = ...;
DateTime d2 = ...;
Period period = new Period(d1, d2, PeriodType.minutes());
int differenceMinutes = period.getMinutes();

En pratique, je pense que cela donnera toujours le même résultat que la réponse basée sur Duration. Pour une unité de temps différente de celle des minutes, cependant, cela peut être plus correct. Par exemple, il y a 365 jours du 2016/2/2 au 2017/2/1, mais en fait, c'est moins d'un an et devrait être tronqué à 0 ans si vous utilisez PeriodType.years().

En théorie, la même chose pourrait se produire pendant des minutes à cause des secondes intercalaires, mais Joda ne prend pas en charge les secondes intercalaires.

L'étoile du matin
la source