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