Jak znaleźć różnicę między dwoma datami Joda-Time w minutach


141

Poniżej metoda, którą napisałem:

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

Teraz z mojej metody widać, że mam obiekt DateTime Joda-Time w obiekcie o nazwie i na podstawie wyniku otrzymuję jeden znacznik czasu, który konwertuję na jodatime . Teraz chcę poznać różnicę między tymi dwiema datami, jak mam to zrobić?datetimepunchTime



2
Ale zadziała to tylko wtedy, gdy obiekty DateTime znajdują się w tej samej strefie czasowej.
Tiago,

1
Days.daysBetween(d1, d2)jest sąsiadem twojego przyjaciela
Shubham Chaudhary

Odpowiedzi:


79

W ten sposób uzyskasz różnicę między dwoma obiektami DateTime w milisekundach:

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

long diffInMillis = d2.getMillis() - d1.getMillis();

78
Odpowiedź MadProgrammera powinna być odpowiedzią zaakceptowaną. Zwróć uwagę na proste użycie Minutes.minutesBetween.
Basil Bourque,

5
Nie, nie zgadzam się, jest to zbyt rozwlekłe i niejasne: „Minuty minuty między datą uderzenia a datą” są gorsze niż „milisekundy drugiej daty minus milisekundy pierwszej daty”
Jonathan Neufeld

4
Nie będzie to uwzględniać czasu letniego.
Sander Versluys

454

Coś jak...

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

Jakie wyjścia

1
24
1440

lub

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

Co jest prawdopodobnie bardziej tym, czego szukasz


Czy powyższe uwzględnia strefy czasowe? A może najpierw powinienem przeliczyć na UTC / GMT?
Doo Dah

@DooDah To dobre pytanie, „wierzę”, że tak jest (zgodnie z koncepcją JodaTime LocalTime), ale sugerowałbym, abyś to przetestował i zobaczył. Powstaje jednak pytanie, w której strefie czasowej byłaby reprezentowana wynikowa wartość?
MadProgrammer

Przetestuję i wymyślę to. Dla mnie wynikową strefą czasową będzie prawdopodobnie serwer, na którym działa kod. Wdrażam zaplanowaną kolejkę i będę musiał obliczyć ilość czasu od teraz do pewnego przyszłego czasu na podstawie daty z innej strefy czasowej. Opowiem o tym, co znalazłem.
Doo Dah

2
Zgadzam się, to powinna być wybrana odpowiedź. Jest schludny i prosty.
Sid

Tworzenie nowego obiektu Duration tylko po to, aby uzyskać różnicę czasu, nie jest fajne. Wyobraź sobie, że musisz wykonać różnicę czasu na dużej tablicy obiektów daty / czasu.
AndroidDev

7

Coś jak...

Minutes.minutesBetween(getStart(), getEnd()).getMinutes();

Nie powiedzie się, jeśli data rozpoczęcia i zakończenia są naprawdę daleko od siebie (większe niż rozmiar int)
dannyRods

3
DateTime d1 = ...;
DateTime d2 = ...;
Period period = new Period(d1, d2, PeriodType.minutes());
int differenceMinutes = period.getMinutes();

W praktyce myślę, że zawsze da to ten sam wynik, co odpowiedź na podstawie Duration. Jednak dla innej jednostki czasu niż minuty może to być bardziej poprawne. Na przykład istnieje 365 dni od 2016/2/2 do 2017/2/1, ale w rzeczywistości jest to mniej niż 1 rok i powinno zostać skrócone do 0 lat, jeśli używasz PeriodType.years().

Teoretycznie to samo może się zdarzyć przez kilka minut z powodu sekund przestępnych, ale Joda nie obsługuje sekund przestępnych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.