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?



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

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


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.