ТЛ; др
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
постоянный ) получил a OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Дамп на консоль…
System.out.println( "now.toString(): " + now );
Когда беги…
now.toString(): 2014-01-21T23:42:03.522Z
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии . Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .
Joda времени
ОБНОВЛЕНИЕ: Проект 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 используют разумные форматы этого стандарта в качестве значений по умолчанию для анализа и генерации строк.
† На самом деле, java.util.Date делает есть часовой пояс, похороненный глубоко под слоями исходного кода. Для большинства практических целей этот часовой пояс игнорируется. Итак, в качестве сокращения, мы говорим, что java.util.Date не имеет часового пояса. Кроме того, этот скрытый часовой пояс не тот, который используется методом Дейта toString
; этот метод использует текущий часовой пояс JVM по умолчанию. Все больше причин избегать этого запутанного класса и придерживаться Joda-Time и java.time.