ТЛ; др
Instant.now() // Capture the current moment in UTC.
Генерация строки для представления этого значения:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
Подробнее
Как сказал правильный ответ Джона Скита , объект java.util.Date не имеет никакого часового пояса † . Но его реализация toString
применяет часовой пояс JVM по умолчанию при генерации строкового представления этого значения даты и времени. Смущает наивного программиста дата , кажется, имеет часовой пояс, но не имеет.
Классы java.util.Date
, j.u.Calendar
и java.text.SimpleDateFormat
в комплекте с Java, как известно, доставляют много хлопот. Избегайте их. Вместо этого используйте любую из следующих компетентных библиотек даты и времени:
java.time (Java 8)
Java 8 предоставляет новый замечательный пакет java.time. * для замены старых классов java.util.Date/Calendar.
Получение текущего времени в UTC / GMT - простая однострочная…
Instant instant = Instant.now();
То, что класс Instant
является основным строительным блоком в java.time, представляет момент на временной шкале в UTC с разрешением наносекунд .
В Java 8 текущий момент фиксируется только с разрешением до миллисекунд. В Java 9 реализована свежая реализация из Clock
фиксирует текущий момент вплоть до полной наносекундной способности этого класса, в зависимости от возможностей тактового оборудования вашего хост-компьютера.
Этот метод toString
генерирует строковое представление своего значения, используя один определенный формат ISO 8601 . Этот формат выводит ноль, три, шесть или девять цифр ( миллисекунд , микросекунд или наносекунд ) по мере необходимости для представления доли секунды.
Если вы хотите более гибкое форматирование или другие дополнительные функции, тогда примените нулевое смещение от UTC для самого UTC (ZoneOffset.UTC
константа ), чтобы получить OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Дамп на консоль ...
System.out.println( "now: " + now );
При запуске…
now: 2014-01-21T23:42:03.522Z
The java.time classes are defined by JSR 310 . Они были вдохновлены Joda-Time, но полностью перестроены.
Joda-Time
ОБНОВЛЕНИЕ: Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Используя Joda-Time стороннюю бесплатную библиотеку с открытым исходным кодом, вы можете получить текущую дату и время всего одной строкой кода.
Joda-Time вдохновил новые классы java.time. * В Java 8, но имеет другую архитектуру. Вы можете использовать Joda-Time в более старых версиях Java. Joda-Time продолжает работать на Java 8 и продолжает активно поддерживаться (по состоянию на 2014 год). Однако команда Joda-Time советует перейти на java.time.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Более подробный пример кода (Joda-Time 2.3)…
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Дамп на консоль…
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
При запуске…
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Дополнительный пример кода, выполняющего работу с часовым поясом, см. мой ответ на аналогичный вопрос.
Часовой пояс
Я рекомендую вам всегда указывать часовой пояс, а не полагаться неявно на текущий часовой пояс JVM по умолчанию (который может измениться в любой момент!). Такое доверие, по-видимому, является распространенной причиной путаницы и ошибок в работе с датой и временем.
При звонке now()
передать желаемый / ожидаемый часовой пояс, который будет назначен. Используйте класс DateTimeZone
.
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Этот класс содержит константу для часового пояса UTC .
DateTime now = DateTime.now( DateTimeZone.UTC );
Если вы действительно хотите использовать текущий часовой пояс JVM по умолчанию, сделайте явный вызов, чтобы ваш код самодокументировался.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
Читайте о ISO 8601 форматах. И java.time, и Joda-Time используют разумные форматы этого стандарта в качестве значений по умолчанию как для разбора, так и для генерации строк.
† Actually, java.util.Date имеет часовой пояс, скрытый глубоко под слоями исходного кода. Для большинства практических целей этот часовой пояс игнорируется. Итак, в качестве сокращения, мы говорим, что java.util.Date не имеет часового пояса. Кроме того, этот скрытый часовой пояс - , а не , который используется методом Date toString
; этот метод использует текущий часовой пояс JVM по умолчанию. Все больше причин избегать этого запутанного класса и придерживаться Joda-Time и java.time.