2

我整个上午都在试图找到一种方法来实现我最初认为相对容易的任务:将以数字方式表示的持续时间转换为可读的方式。例如,对于 3.5 的输入,输出应该是“3 年零 6 个月”。

根据我正在阅读的内容,似乎强烈推荐 Joda Time 库。使用该库并遵循这篇文章,我正在尝试以下操作:

    Period p = new Period(110451600000L); // 3 years and a half

    PeriodFormatter formatter = new PeriodFormatterBuilder()
        .appendYears()
        .appendSuffix(" year", " years")
        .appendSeparator(" and ")
        .appendMonths()
        .appendSuffix(" month", " months")
        .toFormatter();

    System.out.println(formatter.print(p));

但是输出什么都没有。不知道为什么它不起作用。

我也尝试使用Apache DurationFormatUtils,但不起作用。

有人有想法吗?

提前致谢。

4

2 回答 2

4

经过一些研究,测试和benjamin的帮助,我有一个解决方案:

    DateTime dt = new DateTime(); // Now
    DateTime plusDuration = dt.plus(new Duration(110376000000L)); // Now plus three years and a half

    // Define and calculate the interval of time
    Interval interval = new Interval(dt.getMillis(), plusDuration.getMillis());

    // Parse the interval to period using the proper PeriodType
    Period period = interval.toPeriod(PeriodType.yearMonthDayTime());

    // Define the period formatter for pretty printing the period
    PeriodFormatter pf = new PeriodFormatterBuilder()
            .appendYears().appendSuffix("y ", "y ")
            .appendMonths().appendSuffix("m", "m ").appendDays()
            .appendSuffix("d ", "d ").appendHours()
            .appendSuffix("h ", "h ").appendMinutes()
            .appendSuffix("m ", "m ").appendSeconds()
            .appendSuffix("s ", "s ").toFormatter();

    // Print the period using the previously created period formatter
    System.out.println(pf.print(period).trim());

我发现 Joda-Time 的官方文档非常有用,特别是这篇文章:使用 JodaTime 正确定义持续时间

尽管如此,虽然它正在工作,但我并不是 100% 高兴,因为上面发布的代码的输出是“3y 6m 11h”,我不明白这 11 个小时的原因:S 无论如何,我只需要几年的精度和月等我相信问题不大。如果有人知道原因和/或在某些情况下是否有问题,请通过评论告诉我。

于 2012-09-10T09:52:24.203 回答
2

您的代码中的句p点不包含年份或月份,这就是格式化程序根本不输出任何内容的原因。使用格式化程序PeriodFormat.getDefault(),您会看到它包含小时,即正好 30681 = 110451600000 / 1000 / 60 / 60。

这就是为什么:毫秒可以以定义的方式转换为秒、分钟和小时。但是计算天数、月数或年数是模棱两可的,因为一天中的小时数可能不同(时区偏移),一个月中的天数和一年中的天数也可能不同。请参阅文档: http ://joda-time.sourceforge.net/apidocs/org/joda/time/Period.html#Period%28long%29

在那里发现:

为了更好地控制转换过程,您有两种选择:

  • 将持续时间转换为间隔,并从那里获得周期
  • 指定一个周期类型,其中包含精确定义的日期和更大的字段,例如 UTC
于 2012-09-03T14:02:31.887 回答