嗯,在Joda-Time中没有支持您想要查看负持续时间的格式。根据文档,我所能看到的最接近的可能是方法rejectSignedValues()(由名称指示)。我已经在每种可能的配置下进行了测试(将其插入到开始位置、直接在appendMinutes()
之前、直接在其后面,在所有情况下使用未记录的参数false
或true
),但在我的测试中它并没有起到任何作用(请参见更新的附注)。
因此,逻辑上只剩下两个选项:
a)编写此黑客程序:
PeriodFormatter hoursAndMinutesFormatter = new PeriodFormatterBuilder()
.printZeroAlways()
.minimumPrintedDigits(2)
.appendHours()
.appendSeparator(":")
.appendMinutes()
.toFormatter();
long millis = -27900000;
Duration d = new Duration(millis);
Period p = d.toPeriod();
String s;
if (millis < 0) {
s = "-" + hoursAndMinutesFormatter.print(p.negated());
} else {
s = hoursAndMinutesFormatter.print(p);
}
System.out.println("Joda-Time: " + s);
b) 或者切换到另一个对负持续时间有更好支持的库。
=> 例如,使用内置的XML-duration,它具有更好的符号处理能力,但除了与XML-Schema兼容的表示之外,没有真正的格式化程序(尽管您可以自由查询持续时间的单个组件,并使用例如java.util.Formatter
进行格式化)。
long millis = -27900000;
javax.xml.datatype.Duration xmlDuration =
DatatypeFactory.newInstance().newDuration(millis);
System.out.println("XML: " + xmlDuration.toString());
System.out.println(
String.format(
"%1$s%2$02d:%3$02d",
xmlDuration.getSign() < 0 ? "-" : "+",
xmlDuration.getHours(),
xmlDuration.getMinutes()));
=> 或者使用我的库Time4J,它具有基于pattern-based的持续时间格式化程序:
long millis = -27900000
Duration<ClockUnit> duration = Duration.of(millis, ClockUnit.MILLIS)
duration = duration.with(Duration.STD_CLOCK_PERIOD)
String s = Duration.formatter("-hh:mm").format(duration)
System.out.println("Time4J: " + s)
附注:
新的Java-8类 Duration
和 Period
具有与Joda-Time相同的符号处理方式(偏爱不在前面而是在每个单独组件之前)。您可以通过观察 toString()
方法的输出来了解它。不提供任何特殊的持续时间格式化程序。
Joda-Time 的符号处理方式与 XML-Schema v1.1 不兼容(特别是看看第3.3.6.2节:词法映射)。
现在我已经找出了方法 rejectSignedValues()
用于什么。它仅与解析相关,只控制异常行为(可通过其布尔参数进行配置)。但是,解析 "-07:45" 这样的值将产生意外的毫秒值,与您的输入值不同(-22500000 != -27900000)。