我有以下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.
发布于 2016-02-24 11:54:54
--首先我让您的代码可编译:
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-43Mb)使用我的库
这是解决你的具体问题的大炮,但否则它是值得一看的,因为标准化、格式化或解析任何持续时间的可能性是巨大的。Time4J拒绝混合符号,因此该标志只能出现在整个持续时间的前面。
Duration<ClockUnit> d = Duration.formatter(ClockUnit.class, "-hh:mm").parse(input);
System.out.println(d); // -PT43Mhttps://stackoverflow.com/questions/35596233
复制相似问题