在JodaTime中将持续时间转换为String

时间:2016-01-17 18:45:52

标签: java jodatime duration

我有一段时间,例如像这样:

PT-27900S = -27900000 milliseconds

我希望将其转换为格式为(+/- HH:mm)的字符串 Ich我将一个否定持续时间转换为String:

final PeriodFormatter hoursAndMinutesFormatter = new PeriodFormatterBuilder()
                                                .printZeroAlways()
                                                .minimumPrintedDigits(2)
                                                .appendHours()
                                                .appendSeparator(":")
                                                .appendMinutes()
                                                .toFormatter();

我得到了结果如下:

-07:-45

但我想这样。

-07:45

有没有可能像这样格式化它?

1 个答案:

答案 0 :(得分:0)

嗯,Joda-Time中没有格式支持,因为您希望看到负片持续时间。我可以在每个文档中看到的最接近的名称(由名称表示)可能是方法rejectSignedValues()。我已经在每个可能的配置中测试了它(在开始时直接插入appendMinutes()之前,直接在后面插入,在所有情况下都使用未记录的参数falsetrue),但它没有在我的测试中做任何事情(参见更新的附注)。

因此,逻辑上只剩下两个选项:

a)写下这个黑客:

PeriodFormatter hoursAndMinutesFormatter = new PeriodFormatterBuilder()
.printZeroAlways()
.minimumPrintedDigits(2)
.appendHours()
.appendSeparator(":")
//.rejectSignedValues(true) // no effect ?!
.appendMinutes()
.toFormatter();     

long millis = -27900000;
Duration d =  new Duration(millis);
Period p = d.toPeriod();
String s;
if (millis < 0) {
    s = "-" + hoursAndMinutesFormatter.print(p.negated());
} else {
    s = hoursAndMinutesFormatter.print(p);
}

System.out.println("Joda-Time: " + s); // -07:45

b)或者切换到另一个能够更好地支持负片持续时间的库。

=&GT; 内置XML持续时间的示例,它具有更好的符号处理功能,但除了XML-Schema兼容表示之外没有真正的格式化程序(尽管您可以自由查询持续时间的单个组件并使用let {s {{ 1}})。

java.util.Formatter

=&GT;或者使用我的图书馆Time4J,其中有pattern-based个格式化程序:

long millis = -27900000;
javax.xml.datatype.Duration xmlDuration = 
    DatatypeFactory.newInstance().newDuration(millis);
System.out.println("XML: " + xmlDuration.toString()); // -P0Y0M0DT7H45M0.000S
System.out.println(
    String.format(
        "%1$s%2$02d:%3$02d", 
        xmlDuration.getSign() < 0 ? "-" : "+", 
        xmlDuration.getHours(), 
        xmlDuration.getMinutes())); // -07:45

旁注:

  1. 新的Java-8类long millis = -27900000; Duration<ClockUnit> duration = Duration.of(millis, ClockUnit.MILLIS); // create duration = duration.with(Duration.STD_CLOCK_PERIOD); // normalization to hours and minutes String s = Duration.formatter("-hh:mm").format(duration); System.out.println("Time4J: " + s); // -07:45 Duration具有与Joda-Time相同的符号处理(更喜欢不在前面但在每个组件之前的符号)。您可以在观看方法Period的输出时看到它。不提供任何特殊的格式化程序。

  2. Joda-Time的标志处理与XML-Schema v1.1不兼容(特别注意以下部分:3.3.6.2词法映射)。

  3. 现在我已经找到了方法toString()的用途。它是相关的for parsing only并且只控制异常行为(可通过其布尔参数进行配置)。但是,解析类似“-07:45”的值会产生与输入不同的意外毫秒值(-22500000!= -27900000)。