gpt4 book ai didi

java - 将 JodaTime 中的持续时间转换为字符串

转载 作者:行者123 更新时间:2023-12-01 19:54:27 26 4
gpt4 key购买 nike

我有一个持续时间,例如像这样:

PT-27900S = -27900000 milliseconds

我想将其转换为格式为 (+/-HH:mm) 的字符串我将负持续时间转换为字符串:

final PeriodFormatter hoursAndMinutesFormatter = new PeriodFormatterBuilder()
.printZeroAlways()
.minimumPrintedDigits(2)
.appendHours()
.appendSeparator(":")
.appendMinutes()
.toFormatter();

我得到例如这个结果:

-07:-45

但我想要这样。

-07:45

是否可以这样格式化?

最佳答案

嗯,Joda-Time 不支持您查看负持续时间的格式。我在每个文档中看到的最接近的内容(由名称表示)可能是方法 rejectSignedValues() 。我已经在每种可能的配置中测试了它(将其插入到开头,紧接在 appendMinutes() 之前,直接在后面,使用未记录的参数 falsetrue 在所有情况下),但它在我的测试中没有执行任何操作(请参阅更新的旁注)。

所以逻辑上只剩下两个选择:

a) 编写此 hack:

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) 或者切换到另一个对负持续时间有更好支持的库。

=> 内置 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()); // -P0Y0M0DT7H45M0.000S
System.out.println(
String.format(
"%1$s%2$02d:%3$02d",
xmlDuration.getSign() < 0 ? "-" : "+",
xmlDuration.getHours(),
xmlDuration.getMinutes())); // -07:45

=> 或者使用我的库 Time4J其中有 pattern-based持续时间格式化程序:

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
<小时/>

旁注:

  1. 新的 Java-8 类 DurationPeriod 具有与 Joda-Time 相同的符号处理(优选符号不在前面,而是在每个组件之前) 。当您观察方法toString() 的输出时,您可以看到它。不提供任何特殊的持续时间格式化程序。

  2. Joda-Time 的符号处理与 XML-Schema v1.1 不兼容(请特别查看以下部分:3.3.6.2 词汇映射)。

  3. 现在我已经知道了方法 rejectSignedValues() 的用途。相关for parsing only并且仅控制异常行为(可通过其 boolean 参数进行配置)。但是,解析“-07:45”这样的值会产生与您的输入不同的意外毫秒值 (-22500000 != -27900000)。

关于java - 将 JodaTime 中的持续时间转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34842180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com