57

我在 Java 中使用Joda-Time库。我在尝试将 Period 对象转换为“x 天,x 小时,x 分钟”格式的字符串时遇到了一些困难。

这些 Period 对象首先是通过向它们添加一定数量的秒来创建的(它们以秒的形式序列化为 XML,然后从它们重新创建)。如果我只是在其中使用 getHours() 等方法,我得到的只是零,而 getSeconds的总秒数。

如何让 Joda 计算各个字段的秒数,例如天数、小时数等...?

4

4 回答 4

92

您需要对周期进行标准化,因为如果您使用总秒数构造它,那么这是它唯一的值。对其进行标准化会将其分解为总天数、分钟数、秒数等。

由 ripper234 编辑- 添加TL;DR 版本PeriodFormat.getDefault().print(period)

例如:

public static void main(String[] args) {
  PeriodFormatter daysHoursMinutes = new PeriodFormatterBuilder()
    .appendDays()
    .appendSuffix(" day", " days")
    .appendSeparator(" and ")
    .appendMinutes()
    .appendSuffix(" minute", " minutes")
    .appendSeparator(" and ")
    .appendSeconds()
    .appendSuffix(" second", " seconds")
    .toFormatter();

  Period period = new Period(72, 24, 12, 0);

  System.out.println(daysHoursMinutes.print(period));
  System.out.println(daysHoursMinutes.print(period.normalizedStandard()));
}

将打印:

24 分 12 秒
3天24分12秒

因此,您可以看到非标准化期间的输出只是忽略了小时数(它没有将 72 小时转换为 3 天)。

于 2009-09-17T19:11:23.477 回答
23

您还可以使用默认格式化程序,这对大多数情况都有好处:

Period period = new Period(startDate, endDate);
System.out.println(PeriodFormat.getDefault().print(period))
于 2011-02-01T12:18:27.603 回答
12
    Period period = new Period();
    // prints 00:00:00
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds()));
    period = period.plusSeconds(60 * 60 * 12);
    // prints 00:00:43200
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds()));
    period = period.normalizedStandard();
    // prints 12:00:00
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds()));
于 2009-09-17T18:40:35.847 回答
2
PeriodFormatter daysHoursMinutes = new PeriodFormatterBuilder()
    .appendDays()
    **.appendSuffix(" day", " days")
    .appendSeparator(" and ")
    .appendMinutes()
    .appendSuffix(" minute", " minutes")**
    .appendSeparator(" and ")
    .appendSeconds()
    .appendSuffix(" second", " seconds")
    .toFormatter();

你错过了时间,这就是原因。几天后追加几个小时,问题就解决了。

于 2012-02-13T17:07:42.303 回答