2010-02-10 7 views
5

Ich habe Probleme mit Joda Time PeriodFormatter. Ich will, dass man Tage, Stunden, Minuten und Sekunden meldet, aber mein Versuch scheint Wochen zu dauern. Was soll ich anders machen?Mein PeriodFormatter verhält sich nicht wie erwartet - was habe ich falsch gemacht?

import org.joda.time.DateTime; 
import org.joda.time.Period; 
import org.joda.time.format.PeriodFormatter; 
import org.joda.time.format.PeriodFormatterBuilder; 

public class Problems { 

    public static void main(String[] args) { 

     PeriodFormatter formatter = new PeriodFormatterBuilder() 
      .printZeroNever() 
      .appendDays() 
      .appendSuffix(" day", " days") 
      .appendSeparator(", ") 
      .appendHours() 
      .appendSuffix(" hour", " hours") 
      .appendSeparator(", ") 
      .appendMinutes() 
      .appendSuffix(" minute", " minutes") 
      .appendSeparator(", ") 
      .appendSeconds() 
      .appendSuffix(" second", " seconds") 
      .toFormatter(); 

     DateTime now = new DateTime(); 
     DateTime justUnderAWeekAgo = now.minusDays(7).plusMinutes(1); 
     DateTime justOverAWeekAgo = now.minusDays(7).minusMinutes(1); 
     System.out.println(now); 
     System.out.println(justUnderAWeekAgo); 
     System.out.println(justOverAWeekAgo); 
     // I am happy with the following: 
     System.out.println(
      formatter.print(new Period(justUnderAWeekAgo, now))); 
     // But not with this (outputs "1 minute" but I want "7 days, 1 minute"): 
     System.out.println(
      formatter.print(new Period(justOverAWeekAgo, now))); 
    } 
} 

EDIT: ich sehe ich denke, warum dies nicht funktioniert - das heißt, dass die Forma nur die verschiedenen Werte der Periode druckt, und seit Perioden seit Wochen einen Wert speichern, den Wert für Tage auf meinem Problem Zeitraum ist in der Tat 0. Aber ich brauche noch eine gute Möglichkeit, dies zu tun ...

Antwort

12

Das Problem in Ihrem Fall ist, dass Sie nicht Ihre PeriodFormatter bitten, die Wochen anzuzeigen.

Zwei Möglichkeiten:

Lösung 1: Anzeige der Wochen:

PeriodFormatter formatter = new PeriodFormatterBuilder() 
     .printZeroNever() 
     .appendWeeks() 
     .appendSuffix(" week", " weeks") 
     .appendSeparator(", ") 
     .appendDays() 
     .appendSuffix(" day", " days") 
     .appendSeparator(", ") 
     .appendHours() 
     .appendSuffix(" hour", " hours") 
     .appendSeparator(", ") 
     .appendMinutes() 
     .appendSuffix(" minute", " minutes") 
     .appendSeparator(", ") 
     .appendSeconds() 
     .appendSuffix(" second", " seconds") 
     .toFormatter(); 

Der zweite Ausgang in Ihrem Beispiel sein:

1 week, 1 minute 

Lösung 2: Anzeige nur die Tage so müssen Sie die PeriodType.yearMonthDayTime():

verwenden
new Period(justUndeAWeekAgo, now, PeriodType.yearMonthDayTime()); 

Mit dieser zweiten Lösung können Sie Ihre PeriodFormatter so beibehalten, wie sie jetzt ist. Die zweite Ausgabe in Ihrem Beispiel ist dann:

7 days, 1 minute 
+0

Sie haben einen Separator für die Wochen - hinzugefügt. – ripper234

Verwandte Themen