2012-02-16 12 views
8

Ho 2 Joda LocalDateTime oggetti e la necessità di produrre un terzo che rappresenta la differenza tra loro:differenza di due Joda LocalDateTimes

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

LocalDateTime diff = ??? 

L'unico modo che riesco a capire è quello di passare attraverso faticosamente ogni data/campo di tempo ed esegue la sua rispettiva minus funzionamento:

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

Il risultato finale sarebbe semplicemente chiamare diff s' toString() metodo e ottenere qualcosa di significativo. Ad esempio se start.toString() produce 2012/02/08T15: 05: 00 e end.toString() produce 2012/02/08T16: 00: 00, quindi diff.toString() sarebbe la differenza (55 minuti) e potrebbe apparire come 2012/02/08T00: 55: 00.

E, se si tratta di un terribile abuso di LocalDateTime, quindi ho solo bisogno di sapere come prendere la differenza di tempo tra i due e mettere tale differenza in un formato di facile lettura (human friendly).

Grazie in anticipo!

risposta

14

È possibile utilizzare la classe org.joda.time.Period per questo. Per saperne di più org.joda.time.Period

Esempio:

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

mi piace Joda, ma io sono sempre sopraffatto. 'Periodo' e' Durata', suona allo stesso modo, ma è abbastanza diverso. Vedo il bisogno, ma non è sempre intuitivo. –

+0

@MPi: concordato. Cos'è una 'ReadablePartial'? Perché ne ho bisogno per vedere se un 'LocalDateTime' è stato un certo periodo di tempo fa? Agh! –

+0

Perché Periodo potrebbe essere un tempo assoluto non definito. Ad esempio, il Periodo tra le 14:35 e le 15:36, che è una "ora del giorno" parziale, sarà sempre 1 ora e 1 minuto. –

8

Duration è meglio per alcuni casi. È possibile ottenere una durata "fuso orario-indipendente" per l'uso con LocalDateTimes (in linea ora locale) per questo trucco:

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

ho trovato una soluzione utilizzando seguenti operazioni:

  1. Take Two oggetti LocalDateTime come inizio e fine
  2. Convertire entrambi per oggetto istantanea come start.toInstant(ZoneOffset.UTC);
  3. calcolare la durata usando Duration.between(instant t1, instant t2)
  4. Convertire in nan osecondi o millisecondi o secondi utilizzando vari metodi di conversione. I nanosecondi possono essere calcolati come Duration.toNanos()

Ho fornito un esempio completo di seguito.

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

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