Форматирование момента 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, программно и в форматировании и разборе.

Другие вопросы по тегам