对于其中一个项目,我从另一个系统获得了一毫秒的时间。 我需要转换为" yyyy-DDDT:HH:mm:ssZ "
诀窍是在闰秒中显示它。
由于Java库没有闰秒,我决定使用 Time4J 的 Moment 类。
但时刻的toString()
正在打印yyyy-MM-ddTHH:mm:ss
。
是否可以在Moment课程中获得一年中的某一天?
是否有任何示例来创建自定义格式化程序。我试了几个包括ChronoFormatter
。但无法获得理想的结果。
一个令人讨厌的解决方法是将Calendar
用于日期部分,将Moment
用于时间部分。
但它很乏味,从String解析后会很困难。
答案 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.Instant
或java.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中。