Formatting or parsing moments/instants with the element day-of-year is no special problem with the class Moment
and can be done just by choosing a suitable pattern, see this demonstration for a leap second:
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
Keep in mind that any conversion of Moment
-objects to for example java.time.Instant
or java.util.Date
will loose the leap second info however.
Another point: Getting access to the day-of-year-element in class Moment
is not directly possible because the day-of-year is a local element not related to the universal time without zone offset but can be done programmatically if you also specify a zone offset or a timezone. Example:
System.out.println(ls.get(PlainDate.DAY_OF_YEAR.at(ZonalOffset.UTC))); // 366
The same procedure can also be applied to time elements:
System.out.println(ls.get(PlainTime.SECOND_OF_MINUTE.at(ZonalOffset.UTC))); // 60
About the last example: It will only work in context of Moment
but not in context of the local type PlainTime
, of course. The leap second support is deeply embedded in Time4J on all levels when handling the class Moment
, programmatically and in formatting and parsing.