格式化time4j时刻

时间:2017-05-26 15:54:31

标签: java leap-second time4j

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

诀窍是在闰秒中显示它。

由于Java库没有闰秒,我决定使用 Time4J Moment 类。

时刻toString()正在打印yyyy-MM-ddTHH:mm:ss

是否可以在Moment课程中获得一年中的某一天

是否有任何示例来创建自定义格式化程序。我试了几个包括ChronoFormatter。但无法获得理想的结果。

一个令人讨厌的解决方法是将Calendar用于日期部分,将Moment用于时间部分。

但它很乏味,从String解析后会很困难。

1 个答案:

答案 0 :(得分:1)

使用元素日期格式化或解析时刻/瞬间对于类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.Instantjava.util.Date)都会丢失闰秒信息。

另一点:无法直接访问班级Moment中的年份元素,因为日期是与没有区域偏移的通用时间无关的本地元素,但可以如果您还指定了区域偏移或时区,请以编程方式完成。例如:

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中。