2009-09-17 6 views
56

Ich verwende die Joda-Time-Bibliothek mit Java. Ich habe Schwierigkeiten, ein Period-Objekt in eine Zeichenfolge im Format "x Tage, x Stunden, x Minuten" umzuwandeln.Zeitraum zu Zeichenfolge

Diese Periodenobjekte werden zuerst erstellt, indem ihnen eine Anzahl Sekunden hinzugefügt wird (sie werden als Sekunden in XML serialisiert und dann von ihnen neu erstellt). Wenn ich einfach die Methoden getHours() usw. benutze, ist alles, was ich bekomme, null und die Summe Menge an Sekunden mit getSeconds.

Wie kann ich Joda berechnen die Sekunden in die entsprechenden Felder, wie Tage, Stunden, etc ...?

+1

In Verbindung stehende: http://Stackoverflow.com/q/10829870/11236 – ripper234

Antwort

91

Sie müssen den Zeitraum normalisieren, denn wenn Sie es mit der Gesamtzahl der Sekunden erstellen, dann ist das der einzige Wert, den es hat. Normalisieren wird es bricht sie in die Gesamtzahl der Tage, Minuten, Sekunden usw.

Bearbeiten von ripper234 - ein TL;DR version Hinzufügen: PeriodFormat.getDefault().print(period)

Zum Beispiel:

public static void main(String[] args) { 
    PeriodFormatter daysHoursMinutes = new PeriodFormatterBuilder() 
    .appendDays() 
    .appendSuffix(" day", " days") 
    .appendSeparator(" and ") 
    .appendMinutes() 
    .appendSuffix(" minute", " minutes") 
    .appendSeparator(" and ") 
    .appendSeconds() 
    .appendSuffix(" second", " seconds") 
    .toFormatter(); 

    Period period = new Period(72, 24, 12, 0); 

    System.out.println(daysHoursMinutes.print(period)); 
    System.out.println(daysHoursMinutes.print(period.normalizedStandard())); 
} 

drucken :

24 minutes and 12 seconds
3 days and 24 minutes and 12 seconds

So können Sie sehen, dass die Ausgabe für den nicht normalisierten Zeitraum einfach die Anzahl der Stunden ignoriert (die 72 Stunden wurden nicht in 3 Tage umgewandelt).

+0

o.O ... Ich denke, ich hätte etwas ausführlicher schreiben sollen. – Jherico

+0

Danke für die ausgezeichnete Antwort. –

+1

-1 von mir, weil das schwer zu lokalisieren ist. – Trejkaz

12
Period period = new Period(); 
    // prints 00:00:00 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
    period = period.plusSeconds(60 * 60 * 12); 
    // prints 00:00:43200 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
    period = period.normalizedStandard(); 
    // prints 12:00:00 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
+2

Schade, dass Sie Formatzeichenfolge nicht zu Periode oder seinem Formatter übergeben können, um diesen Effekt zu erhalten. – greenoldman

22

Sie können auch die Standard-Formatierungsprogramm verwenden, die für die meisten Fälle gut ist:

Period period = new Period(startDate, endDate); 
System.out.println(PeriodFormat.getDefault().print(period)) 
+0

Ich würde nicht "die meisten Fälle" sagen, aber es ist nützlich, ja. – skaffman

+0

Sollte Teil der akzeptierten Antwort sein. – ripper234

+0

Wenn es Ihren Benutzern wirklich wichtig ist, wie viele Fraktions-Sekunden sie haben, ist das sehr nützlich. –

2
PeriodFormatter daysHoursMinutes = new PeriodFormatterBuilder() 
    .appendDays() 
    **.appendSuffix(" day", " days") 
    .appendSeparator(" and ") 
    .appendMinutes() 
    .appendSuffix(" minute", " minutes")** 
    .appendSeparator(" and ") 
    .appendSeconds() 
    .appendSuffix(" second", " seconds") 
    .toFormatter(); 

Sie die Stunden fehlt, das ist der Grund. Fügen Sie Stunden nach Tagen hinzu und lösen Sie das Problem.