Java – my periodformatter didn’t behave as I expected – what did I do wrong?
I'm having trouble using joda time's periodformatter I want someone to report days, hours, minutes and seconds, but my attempt seems to be in a few weeks What should I do?
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: I think I can see why this doesn't work - that is, the formatter only prints various values of period, and since periods stores a value for several weeks, the number of days during my question period is really 0 But I still need a good way to do this
Solution
In your case, the problem is that you do not require your periodformatter to display weeks
Two possibilities:
Solution 1: Show weeks:
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();
The second output in your example would be:
1 week,1 minute
Solution 2: only the date is displayed, so you must use periodtype yearMonthDayTime():
new Period(justUndeAWeekAgo,Now,PeriodType.yearMonthDayTime());
With the second solution, you can keep the periodformatter in its current state The second output in your example would be:
7 days,1 minute