2012-02-16 13 views
8

Tengo 2 Joda LocalDateTime objetos y la necesidad de producir un tercero que representa la diferencia entre ellos:diferencia de dos Joda LocalDateTimes

LocalDateTime start = getStartLocalDateTime(); 
LocalDateTime end = getEndLocalDateTime(); 

LocalDateTime diff = ??? 

La única manera que puedo imaginar es esmeradamente pasar por cada fecha/campo de hora y realiza su respectiva minus operación:

LocalDateTime diff = end; 

diff.minusYears(start.getYear()); 
diff.minusMonths(start.getMonthOfYear()); 
diff.minusDays(start.getDayOfMonth()); 
diff.minusHours(start.getHourOfDay()); 
diff.minusMinutes(start.getMinuteOfHour()); 
diff.minusSeconds(start.getSecondsOfMinute()); 

El resultado final sería simplemente llamar diff 's toString() método y obtener algo significativo. Por ejemplo, si start.toString() produce 2012/02/08T15: 05: 00, y end.toString() produce 2012/02/08T16: 00: 00, entonces diff.toString() sería la diferencia (55 minutos) y podría verse como 2012/02/08T00: 55: 00.

Y, si esto es un abuso terrible de LocalDateTime, entonces solo necesito saber cómo tomar la diferencia de tiempo entre los dos y poner esa diferencia en un formato fácil de leer (amigable para los humanos).

¡Gracias de antemano!

Respuesta

14

Puede usar la clase org.joda.time.Period para esto. Leer más sobre org.joda.time.Period

Ejemplo:

LocalDateTime endOfMonth = now.dayOfMonth().withMaximumValue(); 
LocalDateTime firstOfMonth = now.dayOfMonth().withMinimumValue(); 
Period.fieldDifference(firstOfMonth, endOfMonth) 
+6

me gusta Joda, pero siempre me siento abrumado. 'Período' y' Duración' suena igual, pero es bastante diferente. Veo la necesidad, pero no siempre es intuitivo. –

+0

@MPi: De acuerdo. ¿Qué es un '' ReadablePartial''? ¿Por qué lo necesito para ver si un 'LocalDateTime' fue hace cierto tiempo? Agh! –

+0

Porque el Período podría ser un tiempo absoluto indefinido. Por ejemplo, el Período entre las 14:35 y las 15:36, que es una "Hora del día" de lectura parcial, siempre será de 1 hora y 1 minuto. –

8

Duration es mejor para algunos casos. Usted puede obtener una duración "zona horaria independiente" para su uso con LocalDateTimes (en la línea de tiempo local) por este truco:

public static Duration getLocalDuration(LocalDateTime start, LocalDateTime end) { 
    return new Duration(start.toDateTime(DateTimeZone.UTC), end.toDateTime(DateTimeZone.UTC)); 
} 
1

he encontrado una solución mediante los siguientes pasos:

  1. Tomar dos objetos LocalDateTime como inicio y fin
  2. Convertir a ambos a objeto instantánea como start.toInstant(ZoneOffset.UTC);
  3. calcular la duración utilizando Duration.between(instant t1, instant t2)
  4. Convertir en Nan oseconds o milisegundos o segundos usando varios métodos de conversión. Nanosegundos se pueden calcular como Duration.toNanos()

He proporcionado un ejemplo completo a continuación.

public long getDuration(LocalDateTime start, LocalDateTime end) { 

    //convert the LocalDateTime Object to an Instant 
    Instant startInstant = start.toInstant(ZoneOffset.UTC);   
    Instant endInstant = end.toInstant(ZoneOffset.UTC); 

    //difference between two Instants is calculated 
    //convert to nano seconds or milliseconds 
    long duration=Duration.between(startInstant, endInstant).toNanos(); 

    return duration; 
} 
0
public static void printTimeDiffJoda(final String start, final String end) { 

     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

     try { 
      // Parse datetime string to org.joda.time.DateTime instance 
      DateTime startDate = new DateTime(format.parse(start)); 
      DateTime endDate = new DateTime(format.parse(end)); 

      System.out.println("Joda Time API - Time Difference "); 
      System.out.println("in years: " + Years.yearsBetween(startDate, endDate).getYears()); 
      System.out.println("in months: " + Months.monthsBetween(startDate, endDate).getMonths()); 
      System.out.println("in days: " + Days.daysBetween(startDate, endDate).getDays()); 
      System.out.println("in hours: " + Hours.hoursBetween(startDate, endDate).getHours()); 
      System.out.println("in minutes: " + Minutes.minutesBetween(startDate, endDate).getMinutes()); 
      System.out.println("in seconds: " + Seconds.secondsBetween(startDate, endDate).getSeconds()); 
      System.out.println(); 

     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
} 

Por http://www.luyue.org/calculate-difference-between-two-dates/