我有一段时间,例如像这样:
PT-27900S = -27900000 milliseconds
我希望将其转换为格式为(+/- HH:mm)的字符串 Ich我将一个否定持续时间转换为String:
final PeriodFormatter hoursAndMinutesFormatter = new PeriodFormatterBuilder()
.printZeroAlways()
.minimumPrintedDigits(2)
.appendHours()
.appendSeparator(":")
.appendMinutes()
.toFormatter();
我得到了结果如下:
-07:-45
但我想这样。
-07:45
有没有可能像这样格式化它?
答案 0 :(得分:0)
嗯,Joda-Time中没有格式支持,因为您希望看到负片持续时间。我可以在每个文档中看到的最接近的名称(由名称表示)可能是方法rejectSignedValues()。我已经在每个可能的配置中测试了它(在开始时直接插入appendMinutes()
之前,直接在后面插入,在所有情况下都使用未记录的参数false
或true
),但它没有在我的测试中做任何事情(参见更新的附注)。
因此,逻辑上只剩下两个选项:
a)写下这个黑客:
PeriodFormatter hoursAndMinutesFormatter = new PeriodFormatterBuilder()
.printZeroAlways()
.minimumPrintedDigits(2)
.appendHours()
.appendSeparator(":")
//.rejectSignedValues(true) // no effect ?!
.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); // -07:45
b)或者切换到另一个能够更好地支持负片持续时间的库。
=&GT; 内置XML持续时间的示例,它具有更好的符号处理功能,但除了XML-Schema兼容表示之外没有真正的格式化程序(尽管您可以自由查询持续时间的单个组件并使用let {s {{ 1}})。
java.util.Formatter
=&GT;或者使用我的图书馆Time4J,其中有pattern-based个格式化程序:
long millis = -27900000;
javax.xml.datatype.Duration xmlDuration =
DatatypeFactory.newInstance().newDuration(millis);
System.out.println("XML: " + xmlDuration.toString()); // -P0Y0M0DT7H45M0.000S
System.out.println(
String.format(
"%1$s%2$02d:%3$02d",
xmlDuration.getSign() < 0 ? "-" : "+",
xmlDuration.getHours(),
xmlDuration.getMinutes())); // -07:45
旁注:
新的Java-8类long millis = -27900000;
Duration<ClockUnit> duration = Duration.of(millis, ClockUnit.MILLIS); // create
duration = duration.with(Duration.STD_CLOCK_PERIOD); // normalization to hours and minutes
String s = Duration.formatter("-hh:mm").format(duration);
System.out.println("Time4J: " + s); // -07:45
和Duration
具有与Joda-Time相同的符号处理(更喜欢不在前面但在每个组件之前的符号)。您可以在观看方法Period
的输出时看到它。不提供任何特殊的格式化程序。
Joda-Time的标志处理与XML-Schema v1.1不兼容(特别注意以下部分:3.3.6.2词法映射)。
现在我已经找到了方法toString()
的用途。它是相关的for parsing only并且只控制异常行为(可通过其布尔参数进行配置)。但是,解析类似“-07:45”的值会产生与输入不同的意外毫秒值(-22500000!= -27900000)。