Meine Periodenformatatter verhält sich nicht wie ich erwarte - was habe ich falsch gemacht?
Frage
Ich habe Probleme, Joda Time's Periodformatter zu verwenden. Ich möchte, dass einer, der Tage, Stunden, Minuten und Sekunden meldet, aber mein Versuch scheint sich um Wochen zu wegen. Was soll ich anders machen?
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)));
}
}
BEARBEITEN: Ich denke, ich kann sehen, warum dies nicht funktioniert - dh, dass das Formatierer nur die verschiedenen Werte des Zeitraums druckt, und da Perioden für Wochen einen Wert speichern Art, dies zu tun ...
Lösung
Das Problem in Ihrem Fall ist, dass Sie Ihre nicht fragen PeriodFormatter
die Wochen anzeigen.
Zwei Möglichkeiten:
Lösung 1: Zeigen Sie die Wochen an:
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();
Die zweite Ausgabe in Ihrem Beispiel ist:
1 week, 1 minute
Lösung 2: Zeigen Sie nur die Tage an, damit Sie die verwenden müssen PeriodType.yearMonthDayTime()
:
new Period(justUndeAWeekAgo, now, PeriodType.yearMonthDayTime());
Mit dieser zweiten Lösung können Sie Ihre behalten PeriodFormatter
wie es jetzt ist. Die zweite Ausgabe in Ihrem Beispiel ist dann:
7 days, 1 minute