格式化time4j时刻

Formatting time4j moment

对于其中一个项目,另一个系统给了我一毫秒的时间。 我需要转换为“yyyy-DDDT:HH:mm:ssZ

诀窍是以闰秒显示它。

由于Java库没有闰秒,我决定使用Time4JMomentclass.

但是 MomenttoString() 正在打印 yyyy-MM-ddTHH:mm:ss

是否可以在 Moment class 中获取 一年中的第几天

是否有创建自定义格式化程序的示例。我尝试了一些,包括 ChronoFormatter。但得不到想要的结果。

一个糟糕的解决方法是对 Date 部分使用 Calendar,对 time 部分使用 Moment

但是很繁琐,从String解析回来会很困难。

格式化或解析 moments/instants 元素 day-of-year 对于 class 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

请记住,Moment 中的任何 conversion 对象,例如 java.time.Instantjava.util.Date 都会丢失闰秒信息。

另一点:无法直接访问 class 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 的上下文。在以编程方式处理 class Moment、格式化和解析时,闰秒支持在 Time4J 的各个层面上都深深嵌入。