Saltar al contenido

Calcular la diferencia entre dos instancias de fecha de Java

Solución:

Diferencia simple (sin lib)

/**
 * Get a diff between two dates
 * @param date1 the oldest date
 * @param date2 the newest date
 * @param timeUnit the unit in which you want the diff
 * @return the diff value, in the provided unit
 */
public static long getDateDiff(Date date1, Date date2, TimeUnit timeUnit) {
    long diffInMillies = date2.getTime() - date1.getTime();
    return timeUnit.convert(diffInMillies,TimeUnit.MILLISECONDS);
}

Y luego puedes llamar:

getDateDiff(date1,date2,TimeUnit.MINUTES);

para obtener la diferencia de las 2 fechas en unidades de minutos.

TimeUnit es java.util.concurrent.TimeUnit, una enumeración estándar de Java que va de nanos a días.


Diferencia legible por humanos (sin lib)

public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) {

    long diffInMillies = date2.getTime() - date1.getTime();

    //create the list
    List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
    Collections.reverse(units);

    //create the result map of TimeUnit and difference
    Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
    long milliesRest = diffInMillies;

    for ( TimeUnit unit : units ) {

        //calculate difference in millisecond 
        long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
        long diffInMilliesForUnit = unit.toMillis(diff);
        milliesRest = milliesRest - diffInMilliesForUnit;

        //put the result in the map
        result.put(unit,diff);
    }

    return result;
}

http://ideone.com/5dXeu6

La salida es algo como Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}, con las unidades ordenadas.

Solo tiene que convertir ese mapa en una cadena fácil de usar.


Advertencia

Los fragmentos de código anteriores calculan una diferencia simple entre 2 instantes. Puede causar problemas durante un cambio de horario de verano, como se explica en esta publicación. Esto significa que si calcula la diferencia entre fechas sin tiempo, es posible que le falte un día / hora.

En mi opinión, la diferencia de fechas es algo subjetiva, especialmente en los días. Puedes:

  • cuente el número de 24 horas transcurridas: día + 1 – día = 1 día = 24h

  • cuente el número de tiempo transcurrido, cuidando el horario de verano: día + 1 – día = 1 = 24 h (pero usando el horario de medianoche y el horario de verano podría ser 0 día y 23 h)

  • contar el número de day switches, lo que significa día + 1 1 p.m. – día 11 a.m. = 1 día, incluso si el tiempo transcurrido es de solo 2 horas (o 1 hora si hay horario de verano: p)

Mi respuesta es válida si su definición de diferencia de fecha en días coincide con el primer caso

Con JodaTime

Si está utilizando JodaTime, puede obtener la diferencia de fechas de 2 instantes (ReadableInstant respaldado por milies) con:

Interval interval = new Interval(oldInstant, new Instant());

Pero también puede obtener la diferencia para fechas / horas locales:

// returns 4 because of the leap year of 366 days
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5), PeriodType.years()).getYears() 

// this time it returns 5
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5+1), PeriodType.years()).getYears() 

// And you can also use these static methods
Years.yearsBetween(LocalDate.now(), LocalDate.now().plusDays(365*5)).getYears()

El JDK Date Desafortunadamente, la API está terriblemente rota. Recomiendo usar la biblioteca Joda Time.

Joda Time tiene un concepto de intervalo de tiempo:

Interval interval = new Interval(oldTime, new Instant());

EDITAR: Por cierto, Joda tiene dos conceptos: Interval para representar un intervalo de tiempo entre dos instantes de tiempo (representar el tiempo entre las 8 a. m. y las 10 a. m.), y un Duration que representa un período de tiempo sin los límites de tiempo reales (por ejemplo, ¡representa dos horas!)

Si solo le importan las comparaciones de tiempo, la mayoría Date implementaciones (incluida la de JDK) implementa Comparable interfaz que le permite utilizar la Comparable.compareTo()

int diffInDays = (int)( (newerDate.getTime() - olderDate.getTime()) 
                 / (1000 * 60 * 60 * 24) )

Tenga en cuenta que esto funciona con fechas UTC, por lo que la diferencia puede ser un día libre si observa las fechas locales. Y lograr que funcione correctamente con las fechas locales requiere un enfoque completamente diferente debido al horario de verano.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *