Разница между UTC и GMT

Привет, у меня есть несколько запросов относительно часовых поясов:

  1. Может ли время быть зафиксировано только в UTC?
  2. Является ли UTC -6 и GMT -6 тем же, и означает ли это, что это местное время в США?
  3. Скажите, у меня время UTC, как "02-01-2018 00:03" означает ли это, что мое местное время в США "01-01-2018 18:00"?

Я искал в Википедии и многих связанных с ней веб-сайтах, но не нашел соответствующего объяснения

Ответы

Ответ 1

Нет разницы во времени между всемирным координированным временем и средним временем по Гринвичу 7:17 утра пятницы, всемирное координированное время (UTC) 7:17 пятница, среднее время по Гринвичу (GMT)

Основное различие: UTC и GMT являются стандартами времени, которые различаются с точки зрения их происхождения и использования.

Цитировать timeanddate.com:

Разница между временем по Гринвичу и UTC:

Среднее время по Гринвичу (GMT) часто перепутывают или путают с Всемирное координированное время (UTC). Но GMT - это часовой пояс, а UTC - это стандарт времени.

Хотя на практике GMT и UTC имеют одинаковое текущее время, основное различие между ними:

  • GMT - часовой пояс, официально используемый в некоторых европейских и африканских странах. Время может отображаться как в 24-часовом формате (0–24), так и в 12-часовом формате (1–12 часов дня/час).
  • UTC - это не часовой пояс, а стандарт времени, который является основой для гражданских часовых поясов и часовых поясов во всем мире. Это означает, что ни одна страна или Территория UTC официально использует местное время.

Ответ 2

Астрономия против атомных часов

Разница в том, что GMT (также официально известный как Universal Time (UT), что может сбивать с толку) основан на астрономических наблюдениях, а UTC - на атомных часах.

GMT означает время по Гринвичу, среднее солнечное время в Королевской обсерватории в Гринвиче на южном берегу в восточном Лондоне, Великобритания. Когда солнце находится в своей самой высокой точке точно над Гринвичом, это 12:00 по Гринвичу. За исключением: Земля вращается слегка неравномерно, поэтому 12 часов дня определяется как среднегодовое значение, то есть среднее время, когда солнце достигает своего пика, его кульминация. В GMT никогда не может быть високосных секунд, потому что вращение Земли не прыгает.

UTC, что означает "Всемирное координированное время" на английском языке, определяется атомными часами, но в остальном это то же самое. В UTC секунда всегда имеет одинаковую длину. В UTC вставляются високосные секунды, чтобы предотвратить смещение UTC и GMT. Напротив, в GMT секунды растягиваются по мере необходимости, поэтому в принципе они не всегда имеют одинаковую длину.

Примерно 100 лет GMT использовалось как основа для определения времени во всем мире. Поскольку в наши дни мир в основном основывает точное определение времени на атомных часах, стало привычным вместо этого определять время по UTC.

На ваши вопросы:

  1. Да, время может быть записано только в UTC. Хранение времени в UTC и использование UTC для передачи информации о времени и дате обычно считается хорошей практикой.
  2. Я полагаю, что каждый штат США должен определить свое время. И я не знаю, но я предполагаю, что сегодня они (официально или на практике) определяют время как смещение от UTC, а не от GMT. Разница между ними всегда будет меньше секунды, поэтому во многих целях вам не нужно будет заботиться. Центральное стандартное время (например, Америка/Чикаго) со смещением -6, как и горное летнее время (например, Америка/Денвер). С другой стороны, смещение -6 не обязательно подразумевает время в США. Конечно, его используют и в некоторых частях Канады и Мексики, а также на Галапагосских островах и острове Пасхи.
  3. Я не думаю, что вы правильно выбрали время для своего примера, но да, 2 января 2018 года в 00:00 UTC - это тот же момент времени, что и 1 января 2018 года в 18:00 в Чикаго и других местах, которые зимой находятся в UTC -6 (зима в северном полушарии, то есть).

Дополнительное чтение: Системы времени.

Ответ 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). Тот же самый момент, другое время настенных часов.

Кроме того, календари, висящие на их стенах, отличаются, так как это "завтра" в Исландии, но "вчера" в континентальной части США. В тот же момент, разные даты!


Table of date-time types in Java, both modern and legacy.


О 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?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с встроенной реализацией ,
    • Java 9 добавляет некоторые мелкие функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport.
  • Android

Table of which java.time library to use with which version of Java or Android

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