用乔达时间周期显示“负”时间周期大小
我在项目中使用乔达时间(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)
方法的预期行为建设Formatter
将只显示-
签收只喜欢第一个元素:
Negative Period: -02:56:02
难道我米是了解API,还是这是一个错误? JodaStephen?任何人?
为了展示我想要的东西并不难,但我只是对Builder方法感到好奇。
感谢,
-Manuel
为rejectSignedValues
的Javadoc说Reject signed values when parsing the next and following appended fields
,即。它只影响解析,而不是打印。
您的建议可能会作出有益的改进,但并不能保证所有组件都是正面的或全部为负面的。这也是一个有效期限:P-6D8H
(正面和负面的混合)。这里
Duration dToFormat = duration;
if (duration.getStandardMinutes() < 0) {
dToFormat = duration.minus(duration).minus(duration);
}
...
if (duration.getStandardMinutes() < 0) {
return "-"+pf.print(p); // leading minus
}
和所有的代码在我的情况:
啊哈。谢谢,史蒂芬。你知道,我在Javadoc中读到过,但显然没有注册。 RTFMC(小心)。我只是使用'持续时间'来区别(这正是我真正想要的),获得'standardSeconds',检查符号,从abs(持续时间)中创建一个'Period'并且构建基于符号的'PeriodFormatter'。除非有更好的方法来格式化'持续时间'?再次感谢并保持伟大的工作。我很好奇你如何从两个DateTime创建一个'P-6D8H'(+/-混合)时期,我只能管理一个'P6D8H'和一个'P-6D-8H'。但是,会继续工作。 – Befloibent
也许那么一个合适的约定可能是:默认情况下,一个符号被带到下一个字段,直到明确颠倒。即“P-3D2H”意味着“过去三天两小时”,而“P-3D + 2H”意味着“过去三天后两小时”。我当然不寒而栗... –
我解决负这样
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);
}
像负频率负的时期没有太大的意义在现实世界中。 JodaTime应该取差值的绝对值。 –
感谢您的意见,彼得,但是,这不是1 /频率的时期。在乔达时代,“周期”是两个时间点之间的差异。当然,差异可以大于或小于零。 – Befloibent
我可以称之为JodaTime支持的间隔。一段时期是经常发生的事情。 –