java – 我的PeriodFormatter表现不像我期望的那样 – 我做错了什么?

我在使用Joda Time的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)));
    }
}

编辑:我想我可以看到为什么这不起作用 – 即格式化程序只打印Period的各种值,并且由于Periods存储了一个值数周,我的问题期间的天数值确实为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

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量