Какова эквивалентная строка формата DateTimeFormatter.ISO_OFFSET_DATE_TIME? - PullRequest
0 голосов
/ 03 октября 2018

Знаем ли мы, что существует строка эквивалентного формата, которая выдает тот же результат, что и DateTimeFormatter.ISO_OFFSET_DATE_TIME?

, т. Е.

ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(dateTime.format(DateTimeFormatter.ofPattern(pattern)));
System.out.println(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));

выдаст тот же

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Нет, это невозможно

По запросу: Да, мы знаем, что нет эквивалентной строки шаблона формата DateTimeFormatter.ISO_OFFSET_DATE_TIME.

DateTimeFormatter.ISO_OFFSET_DATE_TIME пропускает секунды и / илинано секунды, если они равны нулю.Если нано не ноль, «столько цифр будет выведено, сколько требуется». Не существует буквы шаблона или комбинации букв шаблона, которые бы дали вам такое же поведение.

Глубоко внутри DateTimeFormatter, ISO_OFFSET_DATE_TIME использует ISO_LOCAL_TIME, который, в свою очередь, определяется следующим образом:

    ISO_LOCAL_TIME = new DateTimeFormatterBuilder()
            .appendValue(HOUR_OF_DAY, 2)
            .appendLiteral(':')
            .appendValue(MINUTE_OF_HOUR, 2)
            .optionalStart()
            .appendLiteral(':')
            .appendValue(SECOND_OF_MINUTE, 2)
            .optionalStart()
            .appendFraction(NANO_OF_SECOND, 0, 9, true)
            .toFormatter(ResolverStyle.STRICT, null);

Каким образом можно получить динамическое поведение: используя DateTimeFormatterBuilder и его методы optionalStart и appendFraction.

Кстати, вы не хотите точно копировать поведение ISO_OFFSET_DATE_TIME.Вы захотите использовать встроенный форматер.

0 голосов
/ 03 октября 2018

Это сработало для меня:

    ZonedDateTime dateTime = ZonedDateTime.now();
    System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")));
    System.out.println(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));

2018-10-03T07:24:14.772+03:00 
2018-10-03T07:24:14.772+03:00

Хотя это не всегда будет давать один и тот же результат, потому что ISO_OFFSET_DATE_TIME печатает доли секунды с различной длиной в зависимости от значения в нанослоях, в то время как .SSS имеет фиксированную длину = 3

     ZonedDateTime dateTime = ZonedDateTime.of(2001, 1, 1, 0, 0, 0, 1, ZoneId.systemDefault());
     System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")));
     System.out.println(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));   

     2001-01-01T00:00:00.000+02:00
     2001-01-01T00:00:00.000000001+02:00
...