Можно ли отформатировать часовой пояс 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