JodaTime PeriodFormatter

JodaTime PeriodFormatter

我有以下 PeriodFormatter:

PeriodFormatter periodFormatter = new PeriodFormatterBuilder().printZeroAlways().minimumPrintedDigits(2).appendHours().appendSeparator(":")
        .appendMinutes().rejectSignedValues(false).maximumParsedDigits(2).toFormatter();

如果我解析例如-03:00(三小时):

final Duration hoursDuration = periodFormatter.parsePeriod(hours)

但是如果我解析例如-00:43(45 分钟)比我得到正持续时间因为正确的格式是 -00:-43.

我现在的问题是 periodFormatter 有可能。

首先我让你的代码可以编译:

PeriodFormatter periodFormatter = 
    new PeriodFormatterBuilder().printZeroAlways().minimumPrintedDigits(2)
    .appendHours().appendSeparator(":")
    .appendMinutes().rejectSignedValues(false).maximumParsedDigits(2).toFormatter();
Period p1 = periodFormatter.parsePeriod("-03:00"); // PT-3H
System.out.println(p1);
Period p2 = periodFormatter.parsePeriod("-00:43"); // PT43M
System.out.println(p2);

观察到的行为的解释:

Joda-Time 从一开始就以反直觉的方式处理任何时期的迹象。 符号 从来不会与整个时期相关,而仅与时期单个不同的组成部分相关

  • 第一种情况“-03:00”=> 只有小时部分为负(分钟为零)。
  • 第二种情况“00:43”=> 小时分量为零,因此符号无效,而分钟分量为正,因为它前面没有直接带负号。

对这种行为意见不一。虽然 Joda 团队似乎认为这是增强和有用的功能,但像我这样的其他人却觉得它很糟糕。例如,可以将周期构造为 P1M-30D。这样的周期是正数、负数还是零?我们真的不知道。结果是一个周期松散 属性 就像时间轴上定向矢量的长度(持续时间的特征)。

据我所知,在 Joda-Time 中没有机会改变这种行为。 如果您想将“-00:43”解析为-PT43M,请考虑以下选项:

a) 手动解决方法:

String input = "-00:43";
boolean negative = input.charAt(0) == '-';
Period p3 = periodFormatter.parsePeriod(input.replace("-", ""));
if (negative) {
    p3 = p3.negated();
}
System.out.println(p3); // PT-43M

b) 使用我的图书馆 Time4J:

这是解决具体问题的大炮,但除此之外值得一看,因为规范化、格式化或解析任何持续时间的可能性是巨大的。 Time4J 拒绝混合符号,所以符号只能在整个持续时间之前。

Duration<ClockUnit> d = Duration.formatter(ClockUnit.class, "-hh:mm").parse(input);
System.out.println(d); // -PT43M