Можно ли отформатировать часовой пояс UTC с помощью двоеточия в Java?

Я пытаюсь форматировать дату и время, включая часовой пояс с двоеточием. И я провел несколько экспериментов, чтобы получить результат. Вот что я нашел.

Date date = new Date();
String zonedDateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
SimpleDateFormat sdf = new SimpleDateFormat(zonedDateTimeFormat);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(new Date(date.getTime())));

Если я установлю часовой пояс как UTC, я получу такую ​​метку времени:2020-11-03T21:14:07.449Z

Но если часовой пояс не UTC

Date date = new Date();
String zonedDateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
SimpleDateFormat sdf = new SimpleDateFormat(zonedDateTimeFormat);
System.out.println(sdf.format(new Date(date.getTime())));

Отметка времени будет такой: 2020-11-03T22:19:43.804+01:00

Мне интересно, можно ли получить метку времени в часовом поясе UTC, например: 2020-11-03T21:14:07.449+00:00 вместо того, чтобы заканчиваться заглавными буквами Z?

1 ответ

Вы можете использовать Java 8 Date/Time API, на который сильно повлияла библиотека Joda Time (а также, по-видимому, имеет некоторое перекрытие в усилиях разработчиков), но в некоторых отношениях отличается. И, в отличие от Joda Time, Java 8 Date / Time API встроен в Java.

Класс DateTimeFormatter имеет следующие буквы шаблона:

X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z       zone-offset                 offset-Z          +0000; -0800; -08:00

В вашем случае строчные буквы x должен дать желаемый результат.

Пример кода:

import java.time.format.DateTimeFormatter;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.ZoneId;

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx");
ZoneId zone = ZoneId.of("UTC");
ZonedDateTime d = ZonedDateTime.now(zone);
System.out.println(d.format(f));

Вывод:

2020-11-03T22:31:10.928+00:00

Возможно, стоит прочитать описание пакета для API даты и времени Java 8, чтобы понять общую философию API, которая немного отличается от философии объектов даты и календаря java.util.

Короче говоря, основная идея заключается в том, что все объекты даты и времени в этом API неизменны, и что если вы хотите изменить или создать даты, вы должны создать другие объекты даты и времени с помощью заводских методов, таких как of или функции вроде with которые возвращают копию объекта datetime, но с измененным указанным полем.

Некоторые важные классы:

  • Instant - отметка времени
  • LocalDate - дата без времени или ссылка на смещение или часовой пояс
  • LocalTime - время без даты или какой-либо ссылки на смещение или часовой пояс
  • LocalDateTime - объединяет дату и время, но без какого-либо смещения или часового пояса
  • ZonedDateTime - "полная" дата-время с часовым поясом и разрешенным смещением от UTC/ Гринвича
  • ZoneId - представляет часовой пояс

Чтобы преобразовать объект java.util.Date в соответствующие объекты в Java 8 Date/Time API, см.: Преобразование java.util.Date в java.time.LocalDate

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