我有以下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 有可能。
答案 0 :(得分:1)
首先,我要使您的代码可编辑:
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从一开始就以反直觉的方式处理任何时期的迹象。 标志在整个期间内从不相关,但仅限于期间的单个不同组件。
关于这种行为的意见是不同意见。虽然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