So finden Sie den Unterschied zwischen zwei Joda-Time DateTimes in Minuten

141

Unten ist die Methode, die ich geschrieben habe:

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;
}

Aus meiner Methode können Sie nun ersehen, dass ich ein Joda-Time DateTime- Objekt im Objektnamen habe datetimeund aus meinem Ergebnis einen Zeitstempel erhalte, den ich in Jodatime konvertiere punchTime. Jetzt möchte ich den Unterschied zwischen diesen beiden Daten herausfinden. Wie mache ich das?

Deepak Kumar
quelle
9
Minuten # MinutenZwischen ist dein Freund.
Luiggi Mendoza
2
Dies funktioniert jedoch nur, wenn sich Ihre DateTime-Objekte in derselben Zeitzone befinden.
Tiago
1
Days.daysBetween(d1, d2)ist der Nachbar Ihres Freundes
Shubham Chaudhary

Antworten:

79

Dadurch erhalten Sie den Unterschied zwischen zwei DateTime-Objekten in Millisekunden:

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

long diffInMillis = d2.getMillis() - d1.getMillis();
Alfredaday
quelle
78
Die Antwort von MadProgrammer sollte die akzeptierte Antwort gewesen sein. Beachten Sie die einfache Verwendung von Minutes.minutesBetween.
Basil Bourque
5
Nein, ich bin anderer Meinung, es ist zu wortreich und unklar: "Die Minuten Minuten zwischen Punch Time Date Time" sind schlechter als "Millisekunden des zweiten Datums minus Millisekunden des ersten Datums"
Jonathan Neufeld,
4
Dies wird die Sommerzeit nicht berücksichtigen.
Sander Versluys
454

Etwas wie...

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());

Welche Ausgänge

1
24
1440

oder

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

Welches ist wahrscheinlich mehr, was Sie suchen

MadProgrammer
quelle
Berücksichtigt das oben Gesagte Zeitzonen? Oder sollte ich zuerst auf UTC / GMT konvertieren?
Doo Dah
@DooDah Das ist eine gute Frage, ich "glaube", dass dies der Fall ist (wie JodaTime das Konzept hat LocalTime), aber ich würde vorschlagen, dass Sie es testen und sehen. Die Frage wäre jedoch, in welcher Zeitzone der resultierende Wert dargestellt würde.
MadProgrammer
Ich werde das testen und herausfinden. Für mich ist die resultierende Zeitzone wahrscheinlich der Server, auf dem der Code ausgeführt wird. Ich implementiere eine geplante Warteschlange und muss die Zeitspanne zwischen jetzt und einer zukünftigen Zeit basierend auf einem Datum aus einer anderen Zeitzone berechnen. Ich werde zurückmelden, was ich finde.
Doo Dah
2
Ich stimme zu, dies hätte die ausgewählte Antwort sein sollen. Es ist ordentlich und einfach.
Sid
Das Erstellen eines neuen Duration-Objekts, um einen Zeitunterschied zu erzielen, ist einfach nicht cool. Stellen Sie sich vor, Sie müssen einen Zeitunterschied für eine große Anzahl von Datums- / Zeitobjekten durchführen.
AndroidDev
7

Etwas wie...

Minutes.minutesBetween(getStart(), getEnd()).getMinutes();
Carlos Chaguendo
quelle
Schlägt fehl,
3
DateTime d1 = ...;
DateTime d2 = ...;
Period period = new Period(d1, d2, PeriodType.minutes());
int differenceMinutes = period.getMinutes();

In der Praxis denke ich, dass dies immer das gleiche Ergebnis liefert wie die Antwort basierend auf Duration. Für eine andere Zeiteinheit als Minuten ist dies jedoch möglicherweise korrekter. Zum Beispiel gibt es 365 Tage von 2016/2/2 bis 2017/2/1, aber tatsächlich ist es weniger als 1 Jahr und sollte auf 0 Jahre gekürzt werden, wenn Sie verwenden PeriodType.years().

Theoretisch könnte dasselbe aufgrund von Schaltsekunden für Minuten passieren, aber Joda unterstützt keine Schaltsekunden.

Morgen Stern
quelle