Форматирование момента time4j
Для одного из проектов мне дали миллисекунду из другой системы. Мне нужно преобразовать в " гггг-ДДДТ: ЧЧ: мм: ссЗ "
Хитрость заключается в том, чтобы отобразить его в секунду.
Поскольку у библиотек Java нет високосной секунды, я решил использовать класс Moment для Time4J.
Но Момент toString()
печатает yyyy-MM-ddTHH:mm:ss
,
Можно ли получить день года в классе Момент?
Есть ли пример для создания собственного форматера. Я пробовал несколько в том числе ChronoFormatter
, но не смог получить желаемых результатов.
Один неприятный обходной путь должен использовать Calendar
для части даты и Moment
на время часть.
Но это утомительно и будет трудно при разборе обратно из String.
1 ответ
Форматирование или разбор моментов / моментов с элементом день года не представляет особой проблемы для класса. Moment
и это можно сделать, просто выбрав подходящий шаблон, см. следующую демонстрацию:
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
-объекты к примеру 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
, конечно. Поддержка високосных секунд глубоко встроена в Time4J на всех уровнях при работе с классом. Moment
, программно и в форматировании и разборе.