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
我有以下 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