对于其中一个项目,另一个系统给了我一毫秒的时间。 我需要转换为“yyyy-DDDT:HH:mm:ssZ”
诀窍是以闰秒显示它。
由于 Java 库没有闰秒,我决定使用 Time4J 的 Moment 类。
但是 Moment 的 toString()
正在打印 yyyy-MM-ddTHH:mm:ss
。
是否有可能在 Moment 类中获取一年中的某天?
是否有创建自定义格式化程序的示例。我尝试了一些,包括 ChronoFormatter
。但得不到想要的结果。
一个糟糕的解决方法是使用 Calendar
作为 Date 部分,使用 Moment
作为 time 部分。
但是很繁琐,从String解析回来会很困难。
最佳答案
用元素 day-of-year 格式化或解析时刻/时刻对于 Moment
类来说不是特别的问题,只需选择 suitable pattern 即可完成。 , 请参阅此演示了解闰秒:
Moment ls = PlainTimestamp.of(2016, 12, 31, 23, 59, 59).atUTC().plus(1, SI.SECONDS);
System.out.println(ls); // 2016-12-31T23:59:60Z
ChronoFormatter<Moment> f =
ChronoFormatter.ofMomentPattern(
"uuuu-DDD'T'HH:mm:ssX", PatternType.CLDR, Locale.ROOT, ZonalOffset.UTC);
String text = f.format(ls);
System.out.println(text); // 2016-366T23:59:60Z
Moment parsed = f.parse(text);
System.out.println(parsed.isSimultaneous(ls)); // true
请记住,任何 conversion Moment
- 例如 java.time.Instant
或 java.util.Date
的对象将丢失闰秒信息。
另一点:无法直接访问 Moment
类中的 day-of-year-element,因为 day-of-year 是与不带时区的世界时无关的本地元素偏移量,但如果您还指定了时区偏移量或时区,则可以通过编程方式完成。示例:
System.out.println(ls.get(PlainDate.DAY_OF_YEAR.at(ZonalOffset.UTC))); // 366
同样的过程也可以应用于时间元素:
System.out.println(ls.get(PlainTime.SECOND_OF_MINUTE.at(ZonalOffset.UTC))); // 60
关于最后一个例子:当然,它只适用于 Moment
的上下文,但不适用于本地类型 PlainTime
的上下文。在处理 Moment
类时,以编程方式以及格式化和解析方式,闰秒支持在所有级别上都深深地嵌入到 Time4J 中。
关于java - 格式化time4j时刻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44205662/