Я испытываю затруднения с помощью Времени Joda PeriodFormatter. Я хочу, чтобы сообщил о днях, часах, минутах и секундах, но моя попытка, кажется, переносит недели. Что я должен делать по-другому?
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)));
}
}
Править: Я предполагаю I, видят, почему это не работает - т.е. что средство форматирования просто печатает различные значения Периода, и так как Периоды хранят значение в течение многих недель, значение в течение многих дней на моем проблемном периоде действительно 0. Но мне все еще нужен хороший способ сделать это...
Проблема в вашем случае заключается в том, что вы не запрашиваете у своего формата PeriodFormatter
отображение недель.
Два варианта:
Решение 1: Отображение недель:
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();
Вторым вариантом в Вашем примере будет:
1 week, 1 minute
Решение 2: Отображать только дни, поэтому Вам придется использовать PeriodType.yearMonthDayTime()
:
new Period(justUndeAWeekAgo, now, PeriodType.yearMonthDayTime());
Используя это второе решение, Вы можете сохранить формат PeriodFormatter
в том виде, в котором он есть сейчас. Второй вывод в вашем примере будет следующим:
7 days, 1 minute