Come trovare la differenza tra due DateTime di Joda-Time in minuti


141

Di seguito è riportato il metodo che ho scritto:

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

Ora dal mio metodo puoi vedere che ho un oggetto DateTime Joda-Time nell'oggetto denominato e dal mio risultato sto ottenendo un timestamp che sto convertendo in jodatime . Ora voglio scoprire la differenza tra queste due date, come posso farlo?datetimepunchTime



2
Questo funzionerà solo se gli oggetti DateTime sono nello stesso fuso orario.
Tiago,

1
Days.daysBetween(d1, d2)è il vicino del tuo amico
Shubham Chaudhary, il

Risposte:


79

Questo ti darà la differenza tra due oggetti DateTime in millisecondi:

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

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

78
La risposta di MadProgrammer avrebbe dovuto essere la risposta accettata. Si noti il ​​semplice utilizzo di Minutes.minutesBetween.
Basil Bourque,

5
No, non sono d'accordo, è troppo prolisso e poco chiaro: "I minuti minuti tra la data e l'ora del pugno" sono peggiori di "seconda data millisecondi meno prima data millisecondi"
Jonathan Neufeld,

4
Questo non terrà conto dell'ora legale.
Sander Versluys,

454

Qualcosa di simile a...

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

Quali uscite

1
24
1440

o

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

Che probabilmente è più quello che stai cercando


Quanto sopra tiene conto dei fusi orari? O dovrei prima convertirmi in UTC / GMT?
Doo Dah,

@DooDah Questa è una buona domanda, io "credo" che lo faccia (come JodaTime ha il concetto di LocalTime), ma ti suggerirei di provarlo e vedere. La domanda sarebbe, in quale fuso orario sarebbe rappresentato il valore risultante?
MadProgrammer

Proverò e scoprirò questo. Per me, il fuso orario risultante sarà probabilmente il server su cui è in esecuzione il codice. Sto implementando una coda pianificata e dovrò calcolare la quantità di tempo tra ora e qualche ora futura sulla base di una data da un altro fuso orario. Riporterò ciò che trovo.
Doo Dah,

2
Sono d'accordo, questa dovrebbe essere la risposta selezionata. È pulito e semplice.
Sid

La creazione di un nuovo oggetto Duration solo per ottenere una differenza di orario non è interessante. Immagina di dover eseguire una differenza di orario su una vasta gamma di oggetti data / ora.
AndroidDev,

7

Qualcosa di simile a...

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

Non riesce se la data di inizio e fine sono molto distanti (maggiore della dimensione di int)
dannyRods

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

In pratica, penso che questo darà sempre lo stesso risultato della risposta basata su Duration. Per un'unità di tempo diversa dai minuti, tuttavia, potrebbe essere più corretto. Ad esempio, ci sono 365 giorni dal 2016/2/2 al 2017/2/1, ma in realtà è meno di 1 anno e dovrebbe essere troncato a 0 anni se lo usi PeriodType.years().

In teoria lo stesso potrebbe accadere per minuti a causa dei secondi saltati, ma Joda non supporta i secondi saltati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.