С давних времен люди привязывали время к циклическим событиям, которые происходили вокруг них. Это были смена дня и ночи, времена года. В современном мире такая точность при работе со временем часто является неудовлетворительной. Но именно к такому измерению времени привыкло человечество, и, достигнув высокой точности в определении количества времени, много усилий тратит на то, чтобы увязать старые методы измерения времени к современному точному измерению.
Из-за этого человечество усложнило работу со временем различными календарями, часовыми поясами, зимним и летним временем, не говоря о том, что у него не было однозначного понимания такого фундаментального понятия как секунда. И сейчас, даже определившись с понятием секунда, оно пытается все придуманные ранее сложности согласовать с ним.
Каждое событие происходит в определенный момент времени. Чтобы как-то обозначить этот момент времени, и его воспринял другой человек, необходимо принять какой-то другой общепринятый момент времени, который будет началом отсчета, определиться какими интервалами будет проводиться отсчет и отсчитать необходимое количество интервалов. В принципе, это так же просто как определить положение точки на оси, на плоскости или в пространстве. Но как я уже писал ранее, человечество все сильно усложнило.
Календари
В современном мире, для многих задач время удобно измерять в секундах и долях секунды, но долгое время люди изменяли его при помощи суток и лет. Сутки (солнечные сутки) – это период, за который происходит цикл смены дня и ночи, а год (тропический год) – период, за который происходит цикл смены времен года.
Со школы всем известно, что смена времени суток происходит из-за вращения Земли вокруг своей оси относительно центра Солнца, а смена времен года – наклоном оси вращения Земли и ее вращением вокруг Солнца. Тропический год приблизительно равен 365 солнечных суток. Проблема заключается в том, что его нельзя выразить через целое число солнечных суток. В результате, через какое-то время, если ничего не предпринять, времена года сместятся внутри года.
Юлианский и Григорианский календари решают эту проблему с различной точностью путем ввода дополнительных суток в году.
Шкалы времени
Для того, чтобы сопоставить момент времени с численным значением используются различные шкалы времени. Наиболее распространенными являются следующие шкалы:
TAI;
Всемирное время (UT0, UT1, UT2);
UTC;
GPS;
Земное время (TT).
TAI
На данный момент фундаментальным понятием в измерении времени является секунда. Сейчас принято считать, что 1 секунда -это интервал времени равный 9 192 631 770 периодам излучения, соответствующего переходу между двумя сверхтонкими уровнями основного (квантового) состояния атома цезия-133 в покое при 0 К и отсутствии возмущения внешними полями. Такая секунда называется атомной секундой. 0-я атомная секунда произошла 1 января 1958 года 0 часов, 0 минут, 0 секунд по всемирному времени (UT2).
Всемирное время UT
Всемирное время (UT) берет за основу вращение Земли относительно звездного пространства. В виду того, вращение происходит неравномерно, длительность секунды может незначительно изменяться. Определение всемирного времени несколько раз уточнялось, в результате на данный момент существуют несколько разных версий UT0, UT1, UT2. Сейчас широко используется UT1.
UTC
Для того, чтобы связать непостоянную секунду UT1 и постоянную атомную секунду было введено Universal Coordinated Time (UTC).
Суть его заключается в следующем, ученые постоянно наблюдают разницу между временем UT1 и UTC. Эта разница не должна превышать 0.9 атомных секунд. Чтобы не было превышения, принимается решение о введении високосной секунды. Причем в зависимости от разницы она может добавляться или удаляться.
Время UTC отличается от времени TAI на целое количество секунд и на дробное количество секунд от времени UT1. Все секунды времени UTC постоянны.
Секунда UTC равна атомной секунде, но количество секунд во времени UTC в сутках может быть 86400, 86399 или 86401 секунд. Это вызывает сложности при вычислениях, которые требуют большой точности, и поэтому уже долго ведутся научные споры об отмене високосных секунд.
GPS
Шкала времени GPS имеет постоянное, равное 19 с, расхождение с международным атомным временем TAI. Отсчёт времени ведётся в неделях GPS и секундах в рамках текущей недели, начало отсчёта – 00 ч 00 мин 06.01.1980. Так как под номер недели во времени GPS выделяется 10 бит, можно закодировать максимум 1024 недели и каждые 1024 недели отсчет начинается заново. 21 августа 1999 и 6 апреля 2019 проводилось обнуление счетчика недель.
Земное время (TT)
ТT – теоретическая шкала времени. Длительность секунды такая же, как и в TAI. Имеет смещение в 32.184 секунды относительно TAI. Так как время теоретическое, то у него отсутствует погрешность, в отличие от TAI, где погрешность есть, но она ничтожно мала.
Unix
Самым распространенным подходом к работе со временем в информационных технологиях является время Unix. По сути, значение времени Unix это значение счетчика секунд, которые прошли с 1 января 1970 года 0 часов 0 минут 0 секунд времени UTC. Отсчет ведется таким образом, что каждые сутки увеличивают значение счетчика на 86 400. Зная значения счетчика, можно определить дату и время, которые соответствуют этому значению. Так как в Unix времени в сутках всегда 86400 секунд, возникает неоднозначность записи времени UTC в виде Unix времени, когда существует високосная секунда. При дополнительной секунде в UTC последняя секунда суток во времени Unix должна повторяться, если в UTC нет одной секунды, эта секунда должна отсутствовать. Иными словами, секунды во времени Unix могут повторяться или отсутствовать, значение счетчика секунд не всегда однозначно идентифицирует момент во времени.
Для счетчика секунд используется целое число, и так как в разных реализациях операционных систем счетчик может переполняться, это может привести к неверному значению времени. Если используется знаковое 32 битное целое число, то это произойдет по прошествии 2^31 секунд или 19 января 2038 года в 03:14:07. За ним последует 13 декабря 1901 года. Если используется 64 разрядное число, то переполнение не произойдет даже далеком будущем.
Java
В Java тоже во всех сутках 86400 секунд, но момент времени однозначно идентифицируется целым числом секунд. Делается это при помощи соглашения о том, что високосная секунда равномерно распределятся между последними 1000 секунд суток. Иными словами, принято
считать, что каждая из последних 1000 секунд суток с високосной секундой равна 0.999 или 1.001 атомной секунды (секунды UTC), что можно списать на погрешность, которая имеет место при замере времени часами RTC, где используется кварцевый генератор.
NTP (Network Time Protocol)
Сервера точного времени (NTP сервера) базируются на времени UTC, могут брать время из различных источников (трансляция сигналов точного времени по радио, сигналы GPS, другие NTP сервера) и учитывают високосную секунду. Но то, как это будет реализовано, зависит от сервера NTP и операционной системы. Сервер может анонсировать то, что через какое-то время появится високосная секунда, и обязанностью операционной системы является обработать високосную секунду (вернуться на одну секунду назад, заморозить секунду или сгладить во времени), а может сам сгладить во времени и даже не анонсировать ее.
Разные операционные системы по-разному обрабатывают високосную секунду. Windows, например, по умолчанию не поддерживает високосные секунды.
Смещение во времени в различных шкалах
Различные шкалы времени имеют различные начальные точки отсчета. Кроме того, один и тот же момент времени из-за смещения в секундах будет трактоваться по-разному в разных шкалах.
На графике приведены самые распространенные шкалы времени и смещения относительно их, начиная с 1 января 1972 года 0 часов 0 минут 0 секунд UTC (момент времени, когда UTC стал отличаться на целое число секунд от UT1, и было принято решение о високосных секундах). На графике видно, например, что время TAI спешит относительно GPS на 19 секунд, а время UTC из-за вводимых високосных секунд все больше и больше отстает от TAI. Также на графике видно, как время UTC аппроксимирует время UT1.
Часовые пояса
Земной шар можно разделить по меридианам на 24 равных части и для каждой части установить смещение во времени относительно времени UTC на один час. Это смещение называется географическим часовым поясом. Для времени UTC оно равно +0, а вообще оно может принимать значения от -11 до +12. Но в этом случае учитывается только географическое положение, но не учитывается административная принадлежность. Чтобы учитывать административную принадлежность были введены административные часовые пояса, и тут возникает много интересных вещей.
В административных часовых поясах значение смещения не обязательно должно быть равно целому часу и не обязательно должно быть в диапазоне от -11 до +12, поэтому сейчас в мире существуют часовые пояса +14 и +5:30 или даже +5:45. Есть особый часовой пояс, который не проходит ни через одно государство со значением смещения -12. Это линия перемены дат.
Благодаря административным часовым поясам на территории Китая, который занимает несколько географических часовых поясов действует один административный часовой пояс, а в некоторых штатах США могут действовать разные административные часовые пояса в пределах штата.
Кроме того, смещение относительно UTC может меняться не только при движении с запада на восток или востока на запад, но и при движении с севера на юг или с юга на север.
GMT и часовые пояса
Раньше за полдень было принято считать момент времени, когда Солнце находилось в зените, поэтому для каждого города 12 часов дня это были разные моменты времени. В принципе это всех устраивало, так как, добравшись до города, можно было перевести часы и забыть, но, когда возникли паровозы, и нужно было составлять расписание движения поездов, это превратилось в кошмар, поэтому сначала все поезда стали ходить по Лондонскому времени, а потом появилось время GMT и часовые пояса. Время GMT позволяет однозначно определить момент времени на земном шаре, а часовые пояса используются для того, чтобы 12 часов дня были днем, а 6 часов вечера вечером на определенной территории. На данный момент под временем GMT понимается часовой пояс, который совпадает со временем UTC.
Линия перемены дат
Из-за того, что Земля круглая необходимо определиться, где на Земле сегодня, а где завтра. Граница, которая разделяет время на земном шаре на сегодня и завтра называется линией перемены дат. Ее можно было провести по Гринвичскому меридиану, но это было бы очень неудобно , так как он пересекает множество населенных территорий и было бы неудобно, когда на одной части территории сегодня, а на другой уже завтра, поэтому было принято решение провести ее по наименее населенной области планеты в Тихом океане.
Стандартное и летнее время
На административных часовых поясах люди не остановились и добавили еще понятие летнего времени. Летнее время вводилось для экономии расхода электроэнергии. Суть его в следующем, что весной стрелки часов переводятся на час вперед относительно стандартного времени, а зимой на час назад. Когда именно в разных странах этот момент определяется по-разному, поэтому могут быть случаи, когда где-то еще продолжает действие летнее время, а где-то уже оно прекратилось. Часто это может является причиной срывов митингов в географически распределенных командах.
В последнее время многие ученые считают, что перевод часов вызывает стресс у человеческого организма, поскольку ему нужно перестраивать свои биологические часы.
Наблюдается тенденция отказа от летнего времени во многих странах.
Исторические часовые пояса
Если вам показалось этого мало, то следует заметить, что на разных территориях в разные периоды времени могли действовать разные административные часовые пояса. Чтобы упростить работу программиста с такими случаями, была разработана Time Zone Database, которая постоянно дополняется и корректируется. Она содержит исходный код для работы с часовыми поясами, а также описания всех известных часовых поясов (когда и какое часовой пояс использовался на определенной территории, когда вводилось или отменялось летнее время). Многие операционные системы и базы данных используют ее для работы с датой и временем. Так как определения изменяются со временем, нужно проводить обновления определений часовых поясов в операционной системе или СУБД.
Високосный год. Летнее время. Високосная секунда
Високосный год изменяет количество суток в году.
Летнее время оказывает влияние на смещение локального времени относительно UTC, а также изменяет количество часов в сутках, когда происходит переход на летнее время и обратно. Сутки, когда происходит переход на зимнее время, длятся 25 часов, на летнее – 23 часа. Так как во времени UTC нет понятия летнего времени – сутки по времени UTC длятся всегда 24 часа
Високосная секунда изменяет количество секунд в году. Теоретически на данный момент она может быть как плюс, как минус и вводиться до четырех раз в год.
Локальное время и UTC
В одних случаях удобно использовать локальное время, в других время UTC.
Например, рабочая смена начинается в 10 и длится 8 часов в соответствии с локальным временем. Т.е. если предположить, что смена началась в 10 часов вечера по локальному времени, то она должна закончиться в 6 часов утра по локальному времени в независимости от того, был ли переход на летнее или зимнее время во время смены. Фактически сотрудник может работать 7 или 9 реальных часов, но по локальному времени это будет 8 часов.
Возьмем другой пример. Самолет вылетает из аэропорта в 10 часов по локальному времени. Полет занимает 8 часов. Использовать локальное время для расчетов нельзя. Так как добавив 8 часов к локальному времени, мы получим 6 часов утра по локальному времени. Даже, если предположить, самолет не пересекал часовых поясов, мы можем получить неверный результат, если полет осуществлялся во время перехода с зимнего на летнее время или наоборот.
Возможны более сложные варианты, когда самолет вылетает из одного часового пояса, а прилетает в другой, причем в другом перевода на зимнее или летнее время не производится. Чтобы решить такую проблему, нужно локальное время перевести в UTC время, выполнить всю арифметику, а потом перевести в локальное время того часового пояса, для которого мы хотим знать локальное время прилета.
Выводы
В этой статье я не привел никакого исходного кода, программных библиотек, а осветил только базовые понятия, которые вам понадобятся для написания программ для работы со временем.
Но я думаю, информации, приведенной в этой статье вам достаточно чтобы систематизировать ваши знания о времени, и вы узнали что-то новое. Интересных фактов и особенностей работы со временем очень много, и разумеется, что они не уместились в этой статье, которую я старался сделать максимально краткой. Если тема времени окажется вам интересной и требующей продолжения, я его напишу.
Если вы найдете какие-то неточности в статье, буду рад, если вы сообщите о них в комментариях.
Комментарии (6)
trir
12.11.2022 06:38GMT и UTC - не совпадают, у них разные нулевые меридианы. Главное не сказано - время отсчитывается от нулевого меридиана
edo1h
12.11.2022 07:35+1начал читать со скепсисом, на хабре куча всего написано на эту тему, за несколько минут надёргал:
https://habr.com/ru/post/123461/
https://habr.com/ru/post/545434/
https://habr.com/ru/post/146109/
https://habr.com/ru/post/313274/
https://habr.com/ru/post/695688/
https://habr.com/ru/post/528556/
https://habr.com/ru/post/452584/но нет, статья в целом понравилась.
теперь «немного» критики )))
Календари
Шкалы времени
TAI
Всемирное время UT0
UTC
GPS
Земное время (TT)
Unix
Java
NTP (Network Time Protocol)
Смещение во времени в различных шкалах
Часовые пояса
GMT и часовые пояса
Линия перемены дат
Стандартное и летнее время
Исторические часовые пояса
Високосный год. Летнее время. Високосная секунда
Локальное время и UTCоглавление мне кажется путанным, сначала про шкалы и високосные секунды, в конце опять про високосную секунду, летнее время в заголовках два раза, часовые пояса много раз.
и, возможно, двухуровневое оглавление было бы уместнее линейного
Из-за того, что Земля круглая необходимо определиться, где на Земле сегодня, а где завтра. Граница, которая разделяет время на земном шаре на сегодня и завтра называется линией перемены дат.
если бы я не знал о чём речь, то ни за что бы не понял.
сейчас в москве 12-ое, а в нью-йорке 11-ое, но это никак не связано с линией перемены дат
Unix
правильнее было бы написать unix timestamp
Шкала времени GPS имеет постоянное, равное 19 с, расхождение с международным атомным временем TAI.
ТT – теоретическая шкала времени. Длительность секунды такая же, как и в TAI. Имеет смещение в 32.184 секунды относительно TAIИМХО странно было написать о смещении, но никак не упомянуть его причины
a-tk
12.11.2022 18:41Раньше за полдень было принято считать момент времени, когда Солнце находилось в зените
Исправьте пожалуйста неточность: не в зените, а в верхней кульминации.
a-tk
12.11.2022 18:46А сколько за бортом осталось занятных сугубо астрономических вопросов...
Истинное и среднее солнечное время, звёздное время, эфемеридное время (в разных вариациях). Годы: тропический (истинный и средний), сидерический, аномалистический, драконический; солнечный, лунный; юлианский, григорианский и другие...
Exchan-ge
Упущен один важный момент:
«Проходит год, как день,
То длится день, как год,
И, оглянувшись, можно убедиться,
Что время то ползет,
То медленно идет,
То будто слишком быстро мчится.
С рождения до двадцати
Года ползут, несмелые,
А с двадцати до тридцати
Они идут умелые,
Вот с тридцати до сорока
Бегут, как ночи белые,
А с сорока и далее
Летят, как угорелые.
Когда года твои ползут,
Ты прыгаешь и бегаешь,
Зато, когда они идут,
Шаг в ногу с ними делаешь.
Когда ж они начнут бежать,
Тебе ходьба — забота.
А начинают пролетать,
Тебе сидеть охота.
И как бы способ нам найти,
Чтоб в ногу с временем идти» (с) Леонид Утесов.