2012-02-16 9 views
8

Mam 2 Joda LocalDateTime obiektów i trzeba produkować 3rd, który reprezentuje różnicę między nimi:różnica dwóch Joda LocalDateTimes

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

LocalDateTime diff = ??? 

Jedynym sposobem mogę zorientować ma skrupulatnie przejść przez każdy dzień/pole czas i wykonuje swoją pracę odpowiednie minus:

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

Końcowym rezultatem byłoby po prostu zadzwonić diff „s toString() sposób i dostać coś sensownego. Na przykład, jeśli start.toString() produkuje 2012/02/08T15: 05: 00, a end.toString() produkuje 2012/02/08T16: 00: 00, wtedy diff.toString() będzie różnica (55 minut) i może wyglądać 2012/02/08T00: 55: 00.

A jeśli to jest okropne nadużycie LocalDateTime, to po prostu muszę wiedzieć, jak wziąć różnicę czasu między tymi dwoma i umieścić tę różnicę w łatwym do odczytania (ludzkim przyjaznym) formacie.

Z góry dziękuję!

Odpowiedz

14

Do tego celu można użyć klasy org.joda.time.Period. Czytaj więcej o org.joda.time.Period

Przykład:

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

Lubię Joda, ale zawsze jestem przytłoczony. 'Period' i' Duration', brzmi podobnie, ale jest całkiem inny. Widzę potrzebę, ale nie zawsze jest intuicyjna. –

+0

@MPi: Zgoda. Co to jest "Readable Partial"? Dlaczego potrzebuję go, aby sprawdzić, czy 'LocalDateTime' był jakiś czas temu? Agh! –

+0

Ponieważ okres może być niezdefiniowanym czasem bezwzględnym. Na przykład okres między 14:35 a 15:36, który jest "PartialReadable" time of day, zawsze będzie wynosił 1 godzinę i 1 minutę. –

8

Duration jest lepsze dla niektórych przypadkach. Można dostać „strefy czasowej niezależny” czas do użytku z LocalDateTimes (w lokalnej linii czasu) przez ten trick:

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

znalazłem obejście za pomocą następujących czynności:

  1. trwać dwa obiekty LocalDateTime jak start i zakończenie
  2. Konwersja oboje przedmiotowego obiektu, takiego jak start.toInstant(ZoneOffset.UTC);
  3. Oblicz Duration korzystając Duration.between(instant t1, instant t2)
  4. przekształcić go w nan oseconds lub milliseconds lub seconds za pomocą różnych metod konwersji. Nanosekundy można obliczyć jako: Duration.toNanos()

Podałem pełny przykład poniżej.

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

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

Powiązane problemy