我在项目中使用joda-time(1.6.2),我正在做的一件事是获得预测时间和实际时间之间的差异。有时这种差异是积极的,有时是消极的。虽然适当的方法可能是使用Duration
而不是Period
,但使用PeriodFormatter
来显示结果会让我产生一个关于PeriodFormatterBuilder类的问题。举个例子:
DateTime d1 = new DateTime(2011, 6, 17, 13, 13, 5, 0) ;
DateTime d2 = new DateTime(2011, 6, 17, 10, 17, 3, 0) ;
Period negativePeriod = new Period(d1, d2);
Period positivePeriod = new Period(d2, d1);
PeriodFormatter pf = new PeriodFormatterBuilder()
.minimumPrintedDigits(2)
.appendHours()
.appendSuffix(":")
.rejectSignedValues(true) // Does this do anything?
.appendMinutes()
.appendSuffix(":")
.appendSeconds()
.toFormatter();
System.out.printf("Negative Period: %s\n", pf.print(negativePeriod));
System.out.printf("Positive Period: %s\n", pf.print(positivePeriod));
这个输出是:
Negative Period: -02:-56:-02
Positive Period: 02:56:02
我了解Period
分别存储其日期和时间的每个组成部分,但对我来说,构建.rejectSignedValues(true)
的{{1}}方法的预期行为只会显示Formatter
只签署第一个元素,如:
-
我误解了API,还是这个错误? JodaStephen?任何人吗?
展示我想要的东西并不难,但我只是对Builder方法感到好奇。
谢谢,
-Manuel
答案 0 :(得分:1)
rejectSignedValues
的Javadoc说Reject signed values when parsing the next and following appended fields
,即。它只会影响解析,而不会影响打印。
您的提案可能会有所改进,但无法保证所有组件都是正面的,或者都是负面的。这也是一个有效期:P-6D8H
(正面和负面的混合)。
答案 1 :(得分:0)
我像这样解决消极:
Duration dToFormat = duration;
if (duration.getStandardMinutes() < 0) {
dToFormat = duration.minus(duration).minus(duration);
}
...
if (duration.getStandardMinutes() < 0) {
return "-"+pf.print(p); // leading minus
}
以及我案例中的所有代码:
public static String durationToHHHmmFormat(Duration duration, String separator){
if ( duration == null ) {
return null;
}
Duration dToFormat = duration;
if (duration.getStandardMinutes() < 0) {
dToFormat = duration.minus(duration).minus(duration);
}
Period p = dToFormat.toPeriod();
PeriodFormatter pf = new PeriodFormatterBuilder()
.printZeroAlways()
.minimumPrintedDigits(2) // gives the '01'
.appendHours()
.appendSeparator(separator)
.appendMinutes()
.toFormatter();
if (duration.getStandardMinutes() < 0) {
return "-"+pf.print(p); // leading minus
}
return pf.print(p);
}