Z не является литералом
Z
в формате ISO 8601 - это смещение нуля от UT C (также известное как часовой пояс Зулу ). Вам нужно отформатировать и разобрать его как таковой, иначе вы получите неправильные результаты. OffsetDateTime.now()
может и обычно возвращает дату-время с ненулевым смещением. Когда вы печатаете его со смещением Z
, вы печатаете неверную информацию, в другой момент времени.
Я не могу изменить шаблон для использования не буквального 'Z',
Надеюсь, я неправильно понял эту часть. Мне кажется, что у вас есть ошибка, которую вы не можете исправить.
Вам не нужен форматер
OffsetDateTime
и другие классы даты и времени из java .time print ISO 8601 отформатируйте их toString
методы и проанализируйте тот же формат обратно. Поэтому вам не нужно явно указывать какой-либо форматер.
Возможно, класс Instant
соответствует вашим требованиям лучше, чем OffsetDateTime
. Instant
- это момент времени, независимый от часового пояса и смещения. Его метод toString
генерирует строку ISO 8601 в UT C и, следовательно, всегда с Z
в конце.
String string = Instant.now().toString();
System.out.println(string);
// Parse back
Instant time = Instant.parse(string);
System.out.println(time);
Когда я только что запустил это, вывод был:
2020-01-19T05:37:29.630135Z
2020-01-19T05:37:29.630135Z
Если вы можете требовать, чтобы для входящей строки даты-времени всегда было смещение Z
, я должен сказать, что это решение для вас. Вы можете всегда преобразовать Instant
в другой тип после анализа, если вам нужно.
Если вы предпочитаете OffsetDateTime
:
String string = OffsetDateTime.now().toString();
System.out.println(string);
// Parse back
OffsetDateTime time = OffsetDateTime.parse(string);
System.out.println(time);
Пример вывода из моего часового пояса:
2020-01-19T06:37:29.721666+01:00
2020-01-19T06:37:29.721666+01:00
Вы заметили, что напечатано правильное смещение для моего часового пояса, +01:00
, а не Z
, что хорошо показывает, что Z
был бы неправильным. Если вам нужно время UT C, просто скажите OffsetDateTime
, передав ZoneOffseet.UTC
методу now
:
String string = OffsetDateTime.now(ZoneOffset.UTC).toString();
System.out.println(string);
2020-01-19T05:43:06.700402Z
Разбор выполняется так: до этого.