Я надеюсь сделать этот вопрос и ответы на него исчерпывающим руководством по работе с переходом на летнее время, в частности по фактическим изменениям.
Если вам есть что добавить, пожалуйста
Многие системы зависят от сохранения точного времени, проблема заключается в изменениях времени из-за перехода на летнее время - перемещения часов вперед или назад.
Например, в системе приема заказов есть бизнес-правила, которые зависят от времени заказа - если часы изменятся, правила могут быть не такими ясными. Как сохранить время заказа? Есть, конечно, бесконечное количество сценариев - это просто иллюстративный.
- Как вы справились с проблемой перехода на летнее время?
- Какие предположения являются частью вашего решения? (ищите контекст здесь)
Как важно, если не больше так:
- Что ты пробовал, чтобы не получилось?
- Почему это не сработало?
Я был бы заинтересован в программировании, ОС, сохранности данных и других соответствующих аспектах проблемы.
Общие ответы отличные, но я также хотел бы увидеть детали, особенно если они доступны только на одной платформе.
GETDATE()
на SQL будет UTC (как будетDateTime.Now
). И сервер не будет зависеть от каких-либо автоматических изменений DST.DateTime.UtcNow
иGETUTCDATE()
он также показывает других разработчиков, которые вы на самом деле думали об этомОтветы:
Резюме ответов и других данных: (пожалуйста, добавьте свои)
Делать:
datetimeoffset
тип, который может хранить оба в одном поле.1970-01-01T00:00:00Z
(без учета високосных секунд). Если вам требуется более высокая точность, используйте вместо этого миллисекунды. Это значение всегда должно основываться на UTC, без какой-либо настройки часового пояса.DateTimeOffset
это часто лучший выбор, чемDateTime
.DateTime
иDateTimeZone
классы. Будьте осторожны при использованииDateTimeZone::listAbbreviations()
- смотрите ответ . Чтобы поддерживать PHP в актуальном состоянии с данными Олсона, периодически устанавливайте PECL-пакет timezonedb ; смотри ответ .>=
,<
).Не рекомендуется:
America/New_York
«смещение часового пояса», например-05:00
. Это две разные вещи. Смотрите тег часового пояса вики .Date
объект JavaScript для выполнения вычислений даты и времени в старых веб-браузерах, поскольку ECMAScript 5.1 и ниже имеет недостаток дизайна, который может неправильно использовать летнее время. (Это было исправлено в ECMAScript 6/2015).Тестирование:
Ссылка:
timezone
страница тега вики на переполнение стекаdst
timezone
Другой:
источник
Я не уверен, что я могу добавить к ответам выше, но вот несколько моментов от меня:
Типы времени
Есть четыре разных момента, которые вы должны рассмотреть:
Существует также историческое / альтернативное время. Это раздражает, потому что они не могут вернуться к стандартному времени. Например: Юлианские даты, даты в соответствии с лунным календарем на Сатурне, клингонским календарем.
Хранение времени начала / окончания в UTC работает хорошо. Для 1 вам нужно имя часового пояса события + смещение, сохраненное вместе с событием. Для 2 вам нужен локальный идентификатор времени, сохраненный для каждого региона, и имя локального часового пояса + смещение, сохраненное для каждого зрителя (это можно получить из IP, если вы находитесь в затруднительном положении). Для 3 храните в секундах UTC и нет необходимости в часовых поясах. 4 - это особый случай 1 или 2, в зависимости от того, является ли это глобальным или локальным событием, но вам также необходимо сохранить созданное с отметкой времени, чтобы вы могли определить, изменилось ли определение часового пояса до или после создания этого события. Это необходимо, если вам нужно показать исторические данные.
Время хранения
Смещения и имена
Примером вышеупомянутого будет:
С помощью этой информации мы можем исторически определить точное время, когда проходил финал WCS 2010 года, даже если определение часового пояса Южной Африки изменилось, и иметь возможность отображать его зрителям в их местном часовом поясе в тот момент, когда они запрашивают базу данных.
Системное время
Вам также необходимо поддерживать синхронизацию файлов tzdata вашей ОС, базы данных и приложений как между собой, так и с остальным миром, а также проводить тщательные испытания при обновлении. Не случайно, что стороннее приложение, от которого вы зависите, неправильно обрабатывает изменения TZ.
Убедитесь, что аппаратные часы установлены на UTC, и если вы используете серверы по всему миру, убедитесь, что их операционные системы также настроены на использование UTC. Это становится очевидным, когда вам нужно скопировать почасово повернутые файлы журнала apache с серверов в нескольких часовых поясах. Сортировка их по имени файла работает, только если все файлы имеют одинаковый часовой пояс. Это также означает, что вам не нужно делать математику в своей голове, когда вы переходите из одного окна в другое, и вам нужно сравнивать временные метки.
Также запустите ntpd на всех компьютерах.
клиенты
Никогда не доверяйте действительной отметке времени, полученной с клиентского компьютера. Например, Date: HTTP-заголовки или
Date.getTime()
вызов JavaScript . Это хорошо, когда они используются в качестве непрозрачных идентификаторов или когда выполняются вычисления даты во время одного сеанса на одном и том же клиенте, но не пытайтесь сопоставлять эти значения с чем-то, что есть на сервере. Ваши клиенты не запускают NTP и могут не обязательно иметь работающую батарею для своих часов BIOS.пустяки
Наконец, правительства иногда делают очень странные вещи:
Хорошо, я думаю, что я закончил.
источник
DateTimeOffset
(или эквивалент), пригодятся. В противном случае хорошо написать.Это важный и удивительно сложный вопрос. Правда в том, что не существует полностью удовлетворяющего стандарта для постоянного времени. Например, стандарт SQL и формат ISO (ISO 8601) явно недостаточны.
С концептуальной точки зрения обычно используется два типа данных времени и даты, и их удобно различать (вышеупомянутые стандарты этого не делают): « физическое время » и « гражданское время ».
«Физический» момент времени - это точка в непрерывной универсальной временной шкале, с которой сталкивается физика (конечно, игнорируя относительность). Эта концепция может быть надлежащим образом сохранена в UTC, например (если вы можете игнорировать дополнительные секунды).
«Гражданское» время - это спецификация даты и времени, которая следует гражданским нормам: момент времени здесь полностью определяется набором полей даты и времени (Y, M, D, H, MM, S, FS) плюс TZ (спецификация часового пояса). (на самом деле также «календарь»; но давайте предположим, что мы ограничиваем обсуждение григорианским календарем). Часовой пояс и календарь совместно позволяют (в принципе) отображать из одного представления в другое. Но моменты гражданского и физического времени - это принципиально разные типы величин, и они должны концептуально разделяться и обрабатываться по-разному (аналогия: массивы байтов и символьные строки).
Проблема сбивает с толку, потому что мы говорим об этих типах событий взаимозаменяемо, и потому что гражданские времена подвержены политическим изменениям. Проблема (и необходимость различать эти понятия) становится более очевидной для событий в будущем. Пример (взят из моего обсуждения здесь .
Джон записывает в своем календаре напоминание о каком-то событии в дату-время
2019-Jul-27, 10:30:00
, TZ =Chile/Santiago
, (которое имеет смещение GMT-4, следовательно, оно соответствует UTC2019-Jul-27 14:30:00
). Но когда-нибудь в будущем страна решит изменить смещение TZ на GMT-5.Теперь, когда придет день ... должно ли это напоминание вызвать
А)
2019-Jul-27 10:30:00 Chile/Santiago
=UTC time 2019-Jul-27 15:30:00
?или
Б)
2019-Jul-27 9:30:00 Chile/Santiago
=UTC time 2019-Jul-27 14:30:00
?Правильного ответа нет, если только вы не знаете, что концептуально имел в виду Джон, когда говорил календарю: «Пожалуйста, позвоните мне
2019-Jul-27, 10:30:00 TZ=Chile/Santiago
».Он имел в виду «гражданскую дату-время» («когда часы в моем городе показывают 10:30»)? В этом случае А) является правильным ответом.
Или он имел в виду «физический момент времени», точку в непрерывной линии времени нашей вселенной, скажем, «когда произойдет следующее солнечное затмение». В этом случае ответ B) является правильным.
Некоторые API Date / Time правильно понимают это различие: среди них Jodatime , который является основой следующего (третьего!) Java DateTime API (JSR 310).
источник
Проведите четкое архитектурное разделение задач - точно знать, какой уровень взаимодействует с пользователями, и должен изменить дату / время для / из канонического представления (UTC). Дата и время не в формате UTC - это представление (следует за часовым поясом пользователя), время в формате UTC - это модель (остается уникальным для внутреннего и промежуточного уровней).
Кроме того, решите, какова ваша реальная аудитория, что вам не нужно обслуживать и где вы проводите черту . Не трогайте экзотические календари, если у вас нет важных клиентов, а затем подумайте об отдельных серверах, ориентированных на пользователя, только для этого региона.
Если вы можете получить и сохранить местоположение пользователя, используйте его для систематического преобразования даты и времени (например, .NET-культура или таблица SQL), но предоставьте конечному пользователю способ выбора переопределений, если дата-время критически важна для ваших пользователей.
Если существуют исторические обязательства по аудиту (например, точно сказать, когда Jo in AZ оплатил счет 2 года назад в сентябре), сохраните для учета как UTC, так и местное время (таблицы конверсии со временем изменятся).
Определите временный часовой пояс для данных, которые поступают в больших объемах, таких как файлы, веб-сервисы и т. Д. Скажем, у компании East Coast есть дата-центр в ЦА - вам нужно спросить и узнать, что они используют в качестве стандарта вместо того, чтобы предполагать одно или другое.
Не доверяйте смещениям часовых поясов, встроенным в текстовое представление даты и времени, и не соглашайтесь анализировать и следовать им. Вместо этого всегда запрашивайте, чтобы часовой пояс и / или эталонный пояс были явно определены . Вы можете легко получить время со смещением PST, но на самом деле это время EST, так как это эталонное время клиента, и записи были просто экспортированы на сервер, который находится в PST.
источник
Вам необходимо знать о базе данных Olson tz , доступной по адресу
ftp://elsie.nci.nih.gov/pubhttp://iana.org/time-zones/ . Он обновляется несколько раз в год, чтобы справляться с часто меняющимися в последний момент изменениями того, когда (и нужно ли) переключаться между зимним и летним (стандартным и летним) временем в разных странах мира. В 2009 году последний выпуск был 2009-х годов; в 2010 году это было 2010n; в 2011 году это было 2011n; в конце мая 2012 года был выпущен 2012c. Обратите внимание, что в двух отдельных архивах (tzcode20xxy.tar.gz и tzdata20xxy.tar.gz) имеется набор кода для управления данными и собственно данными о часовом поясе. И код, и данные находятся в свободном доступе.Это источник названий часовых поясов, таких как America / Los_Angeles (и синонимов, таких как US / Pacific).
Если вам нужно отслеживать разные зоны, вам нужна база данных Olson. Как и другие советуют, вы также хотите хранить данные в фиксированном формате - обычно выбирается UTC - вместе с записью часового пояса, в котором были сгенерированы данные. Возможно, вы захотите отличить смещение от времени UTC по времени и имени часового пояса; это может изменить ситуацию позже. Кроме того, зная, что в настоящее время 2010-03-28T23: 47: 00-07: 00 (США / Тихий океан) может или не может помочь вам в интерпретации значения 2010-11-15T12: 30 - которое предположительно указано в PST ( Стандартное тихоокеанское время), а не PDT (Тихоокеанское летнее время).
Стандартные интерфейсы библиотеки C не очень полезны для такого рода вещей.
Данные Olson были перенесены, частично из-за того, что AD Olson скоро уйдет на пенсию, и частично из-за того, что был (в настоящее время отклонен) судебный иск против сопровождающих лиц за нарушение авторских прав. База данных часовых поясов теперь управляется под эгидой IANA , Управления по присвоению номеров в Интернете, и на первой странице есть ссылка на « База данных часовых поясов » . Список рассылки обсуждений теперь
tz@iana.org
; список объявлений естьtz-announce@iana.org
.источник
zic.8
странице руководства (илиzic.8.txt
). Вам понадобитсяtzcode2011i.tar.gz
файл, а неtzdata2011i.tar.gz
файл или для получения этой информации.Как правило, включайте смещение местного времени (включая смещение летнего времени) в сохраненные временные метки: одного UTC недостаточно, если позднее вы захотите отобразить временную метку в ее исходном часовом поясе (и настройку летнего времени).
Имейте в виду, что смещение не всегда является целым числом часов (например, индийское стандартное время - UTC + 05: 30).
Например, подходящими форматами являются кортеж (время Unix, смещение в минутах) или ISO 8601 .
источник
Пересечение границы «компьютерного времени» и «времени людей» - это кошмар. Основным из них является отсутствие каких-либо стандартов для правил, регулирующих часовые пояса и переход на летнее время. Страны могут в любое время изменить свои часовые пояса и правила перехода на летнее время, и они делают это.
Некоторые страны, например, Израиль, Бразилия, каждый год решают, когда будет переходить на летнее время, поэтому невозможно заранее знать, когда (если) будет действовать ТЛЧ. Другие имеют фиксированные (ish) правила относительно того, когда действует DST. Другие страны не используют DST как все.
Часовые пояса не должны быть полными часовыми отличиями от GMT. Непал +5,45. Есть даже часовые пояса, которые +13. Что означает, что:
все время, но 3 разных дня!
Также нет четкого стандарта на аббревиатуры для часовых поясов и то, как они меняются, когда в летнее время, поэтому вы в конечном итоге с такими вещами:
Лучший совет - держаться подальше от местного времени, насколько это возможно, и придерживаться UTC, где вы можете. Преобразуйте только в местное время в самый последний момент.
При тестировании обязательно проверяйте страны в западном и восточном полушариях, причем в настоящее время находится как ТЛЧ, так и нет, а также страну, которая не использует ТЛЧ (всего 6).
источник
Для PHP:
Класс DateTimeZone в PHP> 5.2 уже основан на базе данных Olson, которую упоминают другие, поэтому, если вы выполняете преобразование часовых поясов в PHP, а не в базе данных, вы освобождаетесь от работы с (трудными для понимания) файлами Olson.
Однако PHP обновляется не так часто, как БД Olson, поэтому простое использование преобразования часовых поясов в PHP может привести к устаревшей информации о летнем времени и повлиять на правильность ваших данных. Несмотря на то , что это не должно было произойти часто, это может произойти, и будет происходить , если у вас есть большая база пользователей по всему миру.
Чтобы справиться с вышеуказанной проблемой, используйте пакет timezonedb pecl . Его функция - обновлять данные часового пояса PHP. Установите этот пакет так часто, как он обновляется. (Я не уверен, что обновления этого пакета точно следуют обновлениям Olson, но, похоже, он обновляется с частотой, которая, по крайней мере, очень близка к частоте обновлений Olson.)
источник
Если ваш дизайн может вместить его, избегайте преобразования местного времени все вместе!
Я знаю, что для некоторых это может показаться безумным, но подумайте о UX: пользователи обрабатывают близкие относительные даты (сегодня, вчера, следующий понедельник) быстрее, чем абсолютные даты (2010.09.17, пятница 17 сентября). И когда вы думаете об этом больше, точность часовых поясов (и летнего времени) тем важнее, чем ближе дата
now()
, поэтому, если вы можете выразить дату / время в относительном формате для +/- 1 или 2 недели, остальные даты могут быть UTC, и это не будет иметь большого значения для 95% пользователей.Таким образом, вы можете хранить все даты в UTC и делать относительные сравнения в UTC и просто отображать пользовательские даты UTC вне вашего порога относительных дат.
Это также может относиться и к пользовательскому вводу (но, как правило, более ограниченным образом). Выбор из выпадающего меню, в котором есть только {Вчера, Сегодня, Завтра, Следующий понедельник, Следующий четверг}, намного проще и проще для пользователя, чем выбор даты. Сборщики даты являются одними из самых вызывающих боль компонентов заполнения формы. Конечно, это не будет работать для всех случаев, но вы можете видеть, что для того, чтобы сделать его очень мощным, требуется лишь немного хитрый дизайн.
источник
Хотя я не пробовал это сделать, подход к корректировке часового пояса, который я нашел бы убедительным, был бы следующим:
Храните все в UTC.
Создайте таблицу
TZOffsets
с тремя столбцами: RegionClassId, StartDateTime и OffsetMinutes (int, в минутах).В таблице сохраните список дат и времени, когда местное время изменилось, и на сколько. Количество регионов в таблице и число дат будут зависеть от того, какой диапазон дат и областей мира вам нужно поддерживать. Думайте об этом, как будто это «историческая» дата, хотя даты должны включать будущее до некоторого практического предела.
Когда вам нужно вычислить местное время для любого времени UTC, просто сделайте это:
Возможно, вы захотите кешировать эту таблицу в своем приложении и использовать LINQ или другие подобные средства для выполнения запросов, а не попадания в базу данных.
Эти данные могут быть извлечены из базы данных общественного достояния tz .
Преимущества и сноски этого подхода:
Теперь единственным недостатком этого или любого другого подхода является то, что преобразования из местного времени в GMT не являются совершенными, поскольку любое изменение DST, которое имеет отрицательное смещение по отношению к часам, повторяет данное местное время. Боюсь, нелегкий способ справиться с этим, и это одна из причин, по которой местное время хранится в плохих новостях.
источник
Недавно у меня была проблема с веб-приложением, когда при пост-возврате в Ajax время возврата к моему серверному коду отличалось от того, когда было получено время.
Скорее всего, это было связано с моим кодом JavaScript на клиенте, который создал дату для отправки обратно клиенту в виде строки, поскольку JavaScript корректировал часовой пояс и переход на летнее время, а в некоторых браузерах вычислял, когда применять переход на летнее время. казалось, отличается от других.
В итоге я решил полностью удалить вычисления даты и времени на клиенте и отправил обратно на мой сервер по целочисленному ключу, который затем был переведен на дату и время на сервере, чтобы обеспечить согласованные преобразования.
Из этого я узнал: не используйте JavaScript-вычисления даты и времени в веб-приложениях, если это НЕ АБСОЛЮТНО.
источник
Я столкнулся с этим на двух типах систем: «системы планирования смены (например, фабричные рабочие)» и «системы управления, зависящие от газа)…
23 и 25-часовой рабочий день - это боль, с которой приходится справляться, также как и 8-часовые смены, которые занимают 7 или 9 часов. Проблема в том, что вы обнаружите, что у каждого клиента или даже отдела клиента есть свои правила, которые они создали (часто без документирования) в отношении того, что они делают в этих особых случаях.
Некоторые вопросы лучше не задавать клиентам до тех пор, пока они не оплатят ваше «готовое» программное обеспечение. Очень редко можно встретить покупателя, который задумывается об этом типе проблемы при покупке программного обеспечения.
Я думаю, что во всех случаях вы должны записывать время в UTC и конвертировать в / из местного времени перед сохранением даты / времени. Однако даже знать, какое время занимает определенное время, может быть сложно с переходом на летнее и часовые пояса.
источник
Для Интернета правила не так сложны ...
Остальное - просто UTC / локальное преобразование с использованием ваших серверных библиотек даты и времени. Хорошо пойти...
источник
Когда речь идет о приложениях, которые работают на сервере , включая веб-сайты и другие фоновые службы, настройка часового пояса сервера должна игнорироваться приложением.
Общий совет - установить часовой пояс сервера в UTC. Это действительно хорошая передовая практика, но она служит вспомогательным средством для приложений, которые не следуют другим передовым методам. Например, служба может записывать в файлы журнала локальные временные метки, а не временные метки на основе UTC, создавая, таким образом, неоднозначности при переходе на переход на летнее время. Установка часового пояса сервера в UTC исправит это приложение. Однако реальное исправление было бы для приложения, чтобы войти, используя UTC для начала.
Серверный код, включая веб-сайты, никогда не должен ожидать, что местный часовой пояс сервера будет чем-то конкретным.
В некоторых языках местный часовой пояс может легко проникнуть в код приложения. Например,
DateTime.ToUniversalTime
метод в .NET будет конвертировать из локального часового пояса в UTC, иDateTime.Now
свойство возвращает текущее время в местном часовом поясе. Кроме того,Date
конструктор в JavaScript использует локальный часовой пояс компьютера. Есть много других примеров, подобных этому. Важно практиковать защитное программирование, избегая любого кода, который использует настройку локального часового пояса компьютера.Зарезервируйте с использованием местного часового пояса для клиентского кода, такого как настольные приложения, мобильные приложения и клиентский JavaScript.
источник
Держите ваши серверы на UTC и убедитесь, что все они настроены на ntp или эквивалентный.
UTC позволяет избежать проблем с переходом на летнее время, а несинхронизированные серверы могут привести к непредсказуемым результатам, для диагностики которых требуется время.
источник
Будьте осторожны при работе с метками времени, хранящимися в файловой системе FAT32 - они всегда сохраняются в локальных координатах времени (включая DST - см. Статью msdn ). Сгорел на этом.
источник
Еще одна вещь: убедитесь, что на серверах установлен актуальный патч перехода на летнее время.
В прошлом году у нас была ситуация, когда наше время постоянно сокращалось на один час в течение трехнедельного периода для пользователей из Северной Америки, хотя мы использовали систему на основе UTC.
Оказывается, в конце концов это были серверы. Им просто нужно было применить современное исправление ( Windows Server 2003 ).
источник
DateTimeZone::listAbbreviations()
Вывод PHPЭтот метод PHP возвращает ассоциативный массив, содержащий некоторые «основные» часовые пояса (например, CEST), которые сами содержат более конкретные «географические» часовые пояса (например, Европа / Амстердам).
Если вы используете эти часовые пояса и информацию о их смещении / DST, очень важно понимать следующее:
Кажется, что все различные конфигурации смещения / DST (включая исторические конфигурации) каждого часового пояса включены!
Например, Европа / Амстердам можно найти шесть раз в выходных данных этой функции. Два события (смещение 1172/4772) относятся к амстердамскому времени до 1937 года; два (1200/4800) для времени, которое использовалось между 1937 и 1940 годами; и два (3600/4800) для времени, используемого с 1940 года.
Таким образом, вы не можете полагаться на информацию о смещении / DST, возвращаемую этой функцией как правильную / используемую в данный момент!
Если вы хотите узнать текущее смещение / летнее время определенного часового пояса, вам нужно будет сделать что-то вроде этого:
источник
Если вам случается поддерживать системы баз данных, которые работают с активным DST, внимательно проверьте, нужно ли их отключать во время перехода осенью. Mandy DBS (или другие системы) также не любят дважды проходить одну и ту же точку по (местному) времени, что и происходит, когда вы возвращаете часы назад. SAP решил это с помощью (ИМХО действительно аккуратного) обходного пути - вместо того, чтобы повернуть время вспять, они просто позволяли внутренним часам работать на половине обычной скорости в течение двух часов ...
источник
Вы используете .NET Framework ? Если это так, позвольте мне познакомить вас с типом DateTimeOffset , добавленным в .NET 3.5.
Эта структура содержит
DateTime
и смещение (TimeSpan
), который определяет разницу междуDateTimeOffset
датой и временем экземпляра и всемирным координированным временем (UTC).DateTimeOffset.Now
Статический метод возвращаетDateTimeOffset
экземпляр , состоящий из текущего (локального) времени, а также локальное смещение (как определено в региональной информации операционной системы).DateTimeOffset.UtcNow
Статический метод вернетDateTimeOffset
экземпляр , состоящий из текущего времени в UTC (как если бы вы были в Гринвиче).Другими полезными типами являются классы TimeZone и TimeZoneInfo .
источник
Для тех, кто борется с этим в .NET , посмотрите , стоит ли его использовать
DateTimeOffset
и / илиTimeZoneInfo
стоит ли оно того.Если вы хотите использовать часовые пояса IANA / Olson или считаете , что встроенные типы не соответствуют вашим потребностям, обратитесь к Noda Time , которая предлагает гораздо более интеллектуальный API даты и времени для .NET.
источник
Деловые правила всегда должны работать в гражданское время (если не существует законодательства, которое гласит иначе). Имейте в виду, что гражданское время - это беспорядок, но это то, что люди используют, поэтому важно.
Внутренне, храните временные метки во что-то вроде гражданского времени-секунд-от-эпохи. Эпоха не имеет значения , в частности , (я предпочитаю эпоху Unix ) , но он делает вещи проще , чем альтернатива. Представьте, что високосных секунд не существует, если вы не делаете что-то, в чем они действительно нуждаются (например, отслеживание спутников). Отображение между временными метками и отображаемым временем является единственной точкой, где должны применяться правила летнего времени; правила часто меняются (на глобальном уровне, несколько раз в год; обвиняют политиков), поэтому вам следует убедиться, что вы не жестко закодировали сопоставление. ОлсонаБаза данных TZ бесценна.
источник
Просто хотел указать на две вещи, которые кажутся неточными или, по крайней мере, сбивают с толку:
Для (почти) всех практических вычислительных целей UTC фактически является GMT. Если вы не видите метки времени с долей секунды, вы имеете дело с GMT, что делает это различие избыточным.
Временная метка всегда представлена в GMT и поэтому не имеет смещения.
источник
Вот мой опыт: -
(Не требует какой-либо сторонней библиотеки)
источник
getTimezoneOffset
возвращает смещение для даты и времени, когда вы вызываете его. Это смещение может изменяться при переходе часового пояса в летнее время или из него. Смотрите "часовой пояс! = Смещение" в теге часового пояса вики .Видео Тома Скотта о часовых поясах на YouTube на канале Computerphile также содержит приятное и занимательное описание темы. Примеры включают в себя:
источник
На самом деле kernel32.dll не экспортирует SystemTimeToTzSpecificLocation. Однако он экспортирует следующие два: SystemTimeToTzSpecificLocalTime и TzSpecificLocalTimeToSystemTime ...
источник
Никогда не полагайтесь только на конструкторов, таких как
Они могут генерировать исключения, когда определенное время даты не существует из-за летнего времени. Вместо этого создайте свои собственные методы для создания таких дат. В них отлавливают любые исключения, возникающие из-за перехода на летнее время, и корректируют время, необходимое с помощью смещения перехода. Летнее время может происходить в разные даты и в разные часы (даже в полночь для Бразилии) в зависимости от часового пояса.
источник
Только один пример, чтобы доказать, что время обработки - это описанный огромный беспорядок, и что вы никогда не будете довольны. В некоторых местах на этой странице дополнительные секунды были проигнорированы.
Несколько лет назад операционная система Android использовала спутники GPS для получения эталона времени UTC, но игнорировала тот факт, что спутники GPS не используют високосные секунды. Никто не заметил, пока в канун Нового года не было путаницы, когда пользователи телефонов Apple и Android-телефонов делали обратный отсчет с интервалом около 15 секунд.
Я думаю, что с тех пор это было исправлено, но вы никогда не знаете, когда эти «мелкие детали» снова будут преследовать вас.
источник
struct tm
в C. in¹ Некоторые реализации
struct tm
хранят смещение UTC, но это не вошло в стандарт.источник
Имея дело с базами данных (в частности, с MySQL , но это относится к большинству баз данных), мне было трудно хранить UTC.
Я обнаружил, что проще просто хранить дату и время сервера в базе данных, а затем позволить базе данных преобразовывать сохраненную дату и время обратно в UTC (то есть UNIX_TIMESTAMP ()) в инструкциях SQL. После этого вы можете использовать дату и время как UTC в своем коде.
Если у вас есть 100% контроль над сервером и всем кодом, вероятно, лучше изменить часовой пояс сервера на UTC.
источник