Cómo encontrar la diferencia entre dos fechas y horas de Joda-Time en minutos

141

A continuación se muestra el método que escribí:

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

Ahora, desde mi método, puede ver que tengo un objeto Joda-Time DateTime en un objeto llamado datetimey de mi resultado obtengo una marca de tiempo que estoy convirtiendo en jodatime punchTime. Ahora quiero averiguar la diferencia entre estas dos fechas, ¿cómo hago eso?

Deepak Kumar
fuente
9
Minutos # minutosEntre es tu amigo.
Luiggi Mendoza
2
Pero esto solo funcionará si sus objetos DateTime están en la misma zona horaria.
Tiago
1
Days.daysBetween(d1, d2)es el vecino de tu amigo
Shubham Chaudhary

Respuestas:

79

Esto le dará la diferencia entre dos objetos DateTime en milisegundos:

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

long diffInMillis = d2.getMillis() - d1.getMillis();
Alfredaday
fuente
78
La respuesta de MadProgrammer debería haber sido la respuesta aceptada. Observe el uso simple de Minutes.minutesBetween.
Basil Bourque
55
No, no estoy de acuerdo, es demasiado prolijo y poco claro: "Los minutos minutos entre la hora de la fecha y la hora del golpe" son peores que "la segunda fecha milisegundos menos la primera fecha milisegundos"
Jonathan Neufeld
44
Esto no tendrá en cuenta el horario de verano.
Sander Versluys
454

Algo como...

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

Que salidas

1
24
1440

o

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

Que es probablemente más de lo que buscas

MadProgrammer
fuente
¿Lo anterior tiene en cuenta las zonas horarias? ¿O debería convertirme a UTC / GMT primero?
Doo Dah
@DooDah Esa es una buena pregunta, "creo" que lo hace (como JodaTime tiene el concepto de LocalTime), pero te sugiero que lo pruebes y lo veas. Sin embargo, la pregunta sería: ¿en qué zona horaria se representaría el valor resultante?
MadProgrammer
Probaré y resolveré esto. Para mí, la zona horaria resultante probablemente sea el servidor en el que se ejecuta el código. Estoy implementando una cola programada y necesitaré calcular la cantidad de tiempo entre ahora y algún tiempo futuro en función de una fecha de otra zona horaria. Informaré lo que encuentre.
Doo Dah
2
Estoy de acuerdo, esta debería haber sido la respuesta seleccionada. Es ordenado y simple.
Sid
Crear un nuevo objeto de Duración solo para obtener una diferencia horaria no es genial. Imagine tener que realizar una diferencia horaria en una gran variedad de objetos de fecha / hora.
AndroidDev
7

Algo como...

Minutes.minutesBetween(getStart(), getEnd()).getMinutes();
Carlos Chaguendo
fuente
Falla si la fecha de inicio y finalización están muy separadas (mayor que el tamaño de int)
dannyRods
3
DateTime d1 = ...;
DateTime d2 = ...;
Period period = new Period(d1, d2, PeriodType.minutes());
int differenceMinutes = period.getMinutes();

En la práctica, creo que esto siempre dará el mismo resultado que la respuesta basada en Duration. Sin embargo, para una unidad de tiempo diferente a los minutos, podría ser más correcto. Por ejemplo, hay 365 días desde 2016/2/2 hasta 2017/2/1, pero en realidad es menos de 1 año y debería truncarse a 0 años si lo usa PeriodType.years().

En teoría, lo mismo podría ocurrir durante minutos debido a los segundos bisiestos, pero Joda no admite segundos bisiestos.

estrella de la mañana
fuente