Я искал в Википедии и многих связанных с ней веб-сайтах, но не нашел соответствующего объяснения
Ответ 3
Accepted принятый ответ не является ни правильным, ни полезным.
✅ В отличие от этого, Ответ оле В.В. правильно суммирует технические различия - для получения подробной информации перейдите по ссылкам на подробные страницы в Википедии.
Для программистов, создающих бизнес-ориентированные приложения, результатом является то, что UTC - это новое время по Гринвичу. Вы можете использовать термины взаимозаменяемо, с разницей буквально меньше секунды. Так что для большинства практических целей в большинстве приложений нет никакой разницы.
Вот еще несколько практических советов с примерами кода.
Строки
Скажем, у меня время UTC как "02-01-2018 00:03", означает ли это, что мое местное время в США - "01-01-2018 18:00"?
Эта первая часть - плохой пример, в строке даты и времени отсутствует указатель ее смещения или зоны.
Если строка указывает конкретный момент, она должна указывать либо часовой пояс (Continent/Region
отформатированное имя), и/или смещение от UTC в виде количества часов-минут -seconds. Если строка предназначена для представления момента в самом UTC, это означает смещение от UTC, равное нулю.
Чтобы записать эту строку со смещением, могут применяться различные соглашения. На практике лучше всего использовать часы и минуты вместе с двоеточием, например, +00:00
, +05:30
или -08:00
. Начальный ноль и двоеточие являются необязательными, но я видел разрывы библиотек при обнаружении таких значений, как -0800
или -8
.
Zulu
В качестве ярлыка для смещения нуля обычно используется буква Z
для обозначения самого UTC. Произносится Zulu
.
ISO 8601
Кроме того, передовой опыт форматирования даты и времени в текстовом формате для компьютеров - это стандартные форматы ISO 8601. Для даты и времени используется формат ГГГГ-ММ-ДДЧЧ: ММ: СС ± ЧЧ: ММ: СС. T
отделяет часть даты от части времени суток. Этот формат имеет такие преимущества, как, в основном, однозначность, его легко разбирать на машине, легко читать людям в разных культурах. Еще одним преимуществом сортировки по алфавиту является также хронологический. Стандарт также принимает аббревиатуру Z
.
Поэтому ваш пример UTC time as "02-01-2018 00:03"
лучше обозначить как 2018-01-02T00:03Z
.
java.time
Помните, что большинство языков программирования, библиотек и баз данных плохо поддерживают обработку даты и времени, как правило, из-за плохого понимания проблем даты и времени. Обработка даты и времени удивительно сложна и сложна в освоении.
Единственная достойная библиотека, с которой я столкнулся, - это классы java.time (см. Учебное пособие), связанные с Java 8 и более поздними версиями, и его предшественник - проект Joda-Time (также свободно переносится с Java на .Net в проекте Noda Time).
В java.time момент представляется тремя способами. Все они имеют разрешение наносекунд.
Instant
Всегда в UTC. Технически, подсчет наносекунд с начала эпохи первого момента 1970 года (1970-01-01T00: 00: 00Z).
OffsetDateTime
Дата с временем суток в контексте определенного количества часов, минут и секунд перед или после UTC.
ZonedDateTime
Дата с временем суток в контексте определенного часового пояса.
Так в чем же разница между часовым поясом и смещением от UTC? Зачем нам нужны отдельные классы? Смещение от UTC - это просто число часов-минут-секунд, три числа, не больше, не меньше. Часовой пояс в гораздо большем количестве. часовой пояс - это история прошлых, настоящих и будущих изменений в смещении, используемом людьми определенного региона.
Какие изменения? Изменения продиктованы прихотями или мудростью их политиков. Политики всего мира демонстрируют склонность к изменению смещения, используемого часовыми поясами в их юрисдикции. Переход на летнее время (DST) - это один из наиболее распространенных шаблонов изменений, график которого часто меняется, а решение о введении или отмене перехода на летнее время иногда меняется. Также происходят и другие изменения, например, в последние несколько лет Северная Корея меняет свои часы на полчаса для синхронизации с Южной Кореей, Венесуэла поворачивает свои часы на пол-часа. - только для того, чтобы вернуться назад менее чем через десятилетие, Турция в этом году отменила запланированное изменение с летнего времени на стандартное время с небольшим предупреждением, а современная Россия сделала несколько таких изменений в последние годы.
Вернемся к вашему примеру из пункта 3, давайте рассмотрим некоторый код.
Скажем, у меня время UTC как "02-01-2018 00:03", означает ли это, что мое местное время в США - "01-01-2018 18:00"?
У вашего примера строки есть другая проблема. Та минута 03
в первой части игнорирует вашу вторую часть, очевидная опечатка. Я знаю, потому что в этот день в Северной и Южной Америке не действует корректировка часовых поясов, которая занимает неполный час в 57 минут.
Ни минуты
Сначала мы анализируем вашу входную строку. Не имея какого-либо индикатора зоны или смещения, мы должны проанализировать, используя LocalDateTime
. Название LocalDateTime
может вводить в заблуждение, поскольку оно означает конкретную местность. Это означает любую или все населенные пункты. Для получения дополнительной информации см. В чем разница между Instant и LocalDateTime?.
String input = "2018-01-02T00:03" ; // Text of a date with time-of-day but without any context of time zore or offset-from-UTC. *Not* a moment, *not* a point on the timeline.
LocalDateTime ldt = LocalDateTime.parse( input ) ; // Parsing the input as a 'LocalDateTime', a class representing a date with time but no zone/offset. Again, this does *not* represent a moment, is *not* a point on the timeline.
UTC
По фактам, приведенным в Вопросе, мы знаем, что эта дата и время должны были представлять момент в UTC. Таким образом, мы можем присвоить контексту смещения от UTC ноль часов, минут и секунд для самого UTC. Мы применяем константу ZoneOffset
UTC
, чтобы получить объект OffsetDateTime
.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ); // We are certain this text was intended to represent a moment in UTC. So correct the faulty text input by assigning the context of an offset of zero, for UTC itself.
Часовой пояс
Вопрос просит увидеть этот момент через шесть часов после часового пояса, используемого в Соединенных Штатах. Один часовой пояс с таким смещением - America/Chicago
.
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 2-4-буквенное сокращение, например CST
, EST
или IST
, поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Chicago" ) ; // Adjust from UTC to a time zone where the wall-clock time is six hours behind UTC.
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
Смотрите этот код на сайте IdeOne.com.
odt.toString(): 2018-01-02T00:03Z
zdt.toString(): 2018-01-01T18:03-06:00[America/Chicago]
В тот же момент, разное время настенных часов
Этот odt
и zdt
представляют один и тот же момент времени, одну и ту же точку на временной шкале. Разница лишь в настенных часах.
Давайте рассмотрим пример, используя Исландию, где их часовой пояс использует смещение от UTC, равное нулю часов, минут и секунд. Таким образом, зона Atlantic/Reykjavik
имеет время настенных часов, идентичное UTC. По крайней мере, в настоящее время их настенное время соответствует UTC; в прошлом или будущем все может быть по-другому, поэтому неправильно говорить "UTC - это часовой пояс Исландии". В любом случае, наш пример... скажем, кто-то в Рейкьявике, Исландия с 3 минутами после полуночи на часах, висящих на стене, звонит кому-то в США. Этот человек из США живет в месте, где используется часовой пояс Чикагского региона. Когда человек звонит, берет pipeку, он смотрит на часы, висящие на стене, и видит, что время уже после 6 вечера (18:03). Тот же самый момент, другое время настенных часов.
Кроме того, календари, висящие на их стенах, отличаются, так как это "завтра" в Исландии, но "вчера" в континентальной части США. В тот же момент, разные даты!
О java.time
Среда java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time, который теперь находится в режиме обслуживания, рекомендует выполнить переход на классы java.time.
Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите в Кару множество примеров и объяснений. Спецификация: JSR 310.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в классах java.sql.*
.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и еще more.