«Java Date () возвращает дату в UTC» - что это на самом деле означает? - PullRequest
4 голосов
/ 10 мая 2011

Мой вопрос может быть тривиальным, но я просто ищу разъяснения.Я где-то читал в SO, что Java () (на самом деле всегда находится во времени UTC). Почему, когда я создаю объект Date () и печатаю его с помощью toString (), он отображает местное время.Если это не правильный способ напечатать это, что должно быть, чтобы я получил время UTC?

Ответы [ 2 ]

7 голосов
/ 10 мая 2011

Для форматирования вы действительно должны использовать реализацию DateFormat (например, SimpleDateFormat). Это позволит вам указать часовой пояс (и формат вывода). Date само по себе не имеет понятия часовых поясов - оно представляет момент времени, используя «миллисекунды с эпохи Unix» в качестве хранилища. Метод toString() просто конвертирует любой момент времени в местное время, используя часовой пояс системы по умолчанию.

Лично я бы посоветовал полностью отказаться от встроенного API даты / времени и использовать Joda Time в качестве гораздо более разумной библиотеки.

0 голосов
/ 17 января 2019

«Java Date () возвращает дату в UTC» - что это на самом деле означает?

UTC - это базовая линия, относительно которой мы корректируем времядень по всему миру.

Поскольку дни пещерного человека, полдень или 12:00, - это когда солнце находится прямо над головой.Конечно, это означает разные моменты в разных местах.Полдень в Японии случается на несколько часов раньше, чем в Европе, а полдень наступает даже позже в Америке.

В современную эпоху люди создали часовые пояса , где полдень будет применяться к широкому ряду земельнастолько широкие, что солнце не может быть одновременно над всем этим.Таким образом, солнце или «солнечное время» больше не может использоваться для определения времени.Современный часовой пояс определяется как определенное количество часов-минут-секунд от базовой линии.

Какая базовая линия?Эта исходная точка была произвольно выбрана судьбой истории как широта, проходящая через Королевскую обсерваторию 1017 *, Гринвич в Лондоне, Англия, Великобритания.Часовые пояса на востоке - это определенное количество часов-минут-секунд впереди UTC, а на западе определенное число позади UTC.Например, Индия на пять с половиной часов впереди UTC, а Мартиника на Карибских островах на четыре часа позади UTC.

Если смещение равно нулю часов-минут-секунд, то мы говорим, что мы «в UTC» или «в UTC».

Дата Java () фактически всегда в UTCtime

Да, класс java.util.Date, несмотря на неудачное имя, представляет дату с временем суток со смещением от UTC, равным нулю.

Кстати, класс Date устарел.Класс java.time.Instant теперь используется в качестве его замены для представления момента в UTC.Instant имеет разрешение наносекунд , что меньше, чем миллисекунд Date.

, когда я создаю объект Date () и распечатываю его с помощью toString (), он отображает местное время

. много проблем сустаревшие классы даты и времени.Одним из них является плохое наименование, как упомянуто выше.Другим из них является благонамеренное неудачное решение о дизайне, согласно которому Date::toString должен динамически применять текущий часовой пояс JVM по умолчанию для корректировки по UTC при создании текста.Это плохое решение не принесло запутанности и боли программистам на Java, поскольку оно создает иллюзию, что java.util.Date назначен часовой пояс.

В качестве отступления ... Еще хуже, java.util.Date имеет часовой пояс, но скрыт глубоко в своем исходном коде без методов получения / установки методов доступа.Но эта зона влияет на поведение, такое как определение равенства между объектами этого класса.Смешение?Да.Как я уже сказал, эти устаревшие классы даты и времени изобилуют неудачными проектными решениями.

Если это неправильный способ его печати, что должно быть, чтобы я получал время UTC?

Правильный путь - полностью исключить класс Date.Вместо этого используйте только классы java.time .

➥ Чтобы получить текущий момент в UTC, используйте Instant.now.

Instant instant = Instant.now() ;

Совет: Если вы хотите изменить время для искусственного тестирования, передайте альтернативное значение Clock на Instant.now( Clock ).

Чтобы сгенерировать String с текстом, представляющим значение этого Instant в стандартном формате ISO 8601 , просто позвоните toString.К счастью, этот класс не вводит часовой пояс, как Date.Метод Instant::toString сообщает простую правду, текст момента в UTC.

String output = instant.toString() ;

2019-12-03T10: 15: 30.032163Z

Имейте в виду, что объекты даты и времени, такие как Instant, не имеют «формата».Только текст, представляющий значение этих объектов, имеет формат.Текст и объект даты и времени различны и отделены друг от друга.Объект даты и времени может генерировать такой текст и может анализировать такой текст, но на самом деле это не текст.

Если вам нужен flexibilЧтобы генерировать текст в других форматах, примените ZoneOffset, чтобы получить объект OffsetDateTime, или примените ZoneId, чтобы получить ZonedDateTime объект.Примените объект DateTimeFormatter для создания текста.


About java.time

java.time *Платформа 1124 * встроена в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

...