Unix-время


undefined

Unix-время (англ. Unix time, также POSIX-время) — система описания моментов во времени, принятая в Unix и других POSIX-совместимых операционных системах. Определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг); этот момент называют «эпохой Unix» (англ. Unix Epoch).

Целочисленное представление

Unix-время представлено целым числом, которое увеличивается с каждой прошедшей секундой без необходимости вычислений для определения года, месяца, дня, часа или минуты для удобства восприятия человеком. Современное Unix-время согласуется с UTC — отсчет происходит в секундах СИ. Временной промежуток одного дня почти всегда разбит на 86 400 секунд, но при объявлении дополнительных секунд составляет 86 401 секунду. Такие секунды, согласно Всемирному времени, сохраняют длительность дней синхронизированной со временем оборота планеты. В Unix-времени соответствующие номера секунд повторяются, то есть високосные секунды не учитываются.

В момент времени 00:00:00 UTC 1 января 1970 года (четверг) Unix-время равно нулю. Начиная с этого времени, число возрастает на определённое количество в день. Таким образом, к примеру, 16 сентября 2004 года в 00:00:00, спустя 12677 дней после начала отсчета Unix-времени, время будет представлено числом 12 677 × 86 400 = 1 095 292 800, или в случае с 17 декабря 2003 года в 00:00:00, через 12403 дня после начала отсчёта время будет являться числом 12403 × 86 400 = 1 071 619 200. Расчеты могут быть также произведены в обратном направлении, используя отрицательные числа. К примеру, дата 4 октября 1957 года 00:00:00, а это 4472 дня до начала отсчета, представлена в Unix-времени числом −4472 × 86 400 = −386 380 800[1].

Каждый день число, представляющее Unix-время, вычисляется описанным образом в UTC (00:00:00Z), и увеличивается ровно на 1 в секунду, начиная с полночи. Следовательно, момент времени 16-09-2004 17:55:43,54, соответствующий 64 543,54 секунды от полуночи этой даты, из примера выше, будет представлен в Unix-времени числом 1 095 292 800 + 64 543,54 = 1 095 357 343,54. Для дат, предшествующих началу отсчета, число также возрастает, то есть с течением времени приближается к нулю[2].

Используемую целочисленную систему удобно использовать для сравнения и хранения дат (дата и время в этом формате занимают всего 4 или 8 байт). При необходимости обращения к элементам дат (день, месяц, год) секунды можно преобразовать в любой подходящий формат (и наоборот).

В программах для хранения Unix-времени используется целочисленный знаковый тип. 32-битные числа со знаком могут ссылаться на моменты времени от пятницы 13 декабря 1901 года 20:45:52 до вторника 19 января 2038 года 03:14:07 включительно.

Чтобы узнать текущее Unix-время в большинстве Unix-подобных систем, можно использовать команду date +%s.

Критические значения

Минимальная дата в знаковом 32-битном представлении — 13 декабря 1901 года, 20:45:52 UTC (0x80000000, −2 147 483 648 секунд от 1 января 1970 года).

Потенциально критической датой считалось 9 сентября 2001 года, 01:46:40 UTC, соответствующее одной гигасекунде (миллиарду секунд) по Unix-времени, когда символьное десятичное представление превысило 9 позиций, что могло сказаться на работе некоторых медицинских приложений[3].

Главной критической датой с точки зрения Unix-времени считается 19 января 2038 года в 03:14:08 по всемирному времени, когда значение переменной типа time_t, отсчитывающей число секунд, прошедших с 1 января 1970 года, достигнет 231, что может привести к ошибочной интерпретации этого числа как отрицательного. Комплекс рисков, связанных с этой датой, получил наименование проблемы 2038 года. Возможное решение данной проблемы состоит в использовании для хранения времени не 32-битной, а 64-битной переменной (что и делается во всех современных 64-битных операционных системах), этого хватит на 292 млрд лет[4].

Проблема Apple iOS как Unix-системы

У 64-битных iOS-устройств от Apple существует проблема как Unix-системы: если перевести время на устройстве с 64-битным процессором под управлением iOS на час ночи первого января 1970 года и перезагрузить устройство, будучи в часовом поясе от UTC +1:30 и больше, то после перезагрузки устройства оно не будет включаться, на экране постоянно будет отображаться логотип Apple. Происходит это из-за разницы в часовых поясах, то есть: если перевести время на 1:00 1 января 1970 года в часовом поясе UTC +1:30 или больше, то счётчик Unix-времени уходит в минус, что система понять не в состоянии, так как отсчёт ведётся от UTC, вследствие чего устройство зависает. Устройство не восстанавливается через DFU, но у проблемы есть два решения другими способами. Первый способ: ждать пока аккумулятор телефона сядет полностью и счётчик сам сбросится на нулевое состояние. Второй способ: разобрать устройство и отключить аккумулятор на некоторое время, затем собрать устройство, счётчик также сбросится на ноль и устройство будет работать.

Проблема окончательно решена в iOS 9.3.1[5] — теперь на устройстве доступны для установки даты начиная с 1 января 2001 года.

Эпоха UNIX

В конце 1940-х годов увеличение числа телефонных абонентов привело к тому, что диспетчеризированная телефония не справляется с запросами потребителей. Изобретение транзистора решило проблему путём автоматизации телефонных соединений, однако для большинства абонентов тарифы на связь были высоки.

Разработка новых вычислительных систем позволила ввести тарифные сетки для локальных, междугородних и международных звонков, а также посекундную тарификацию, что вызвало значительное снижение стоимости звонков, и как следствие, огромный прирост абонентских разговоров в 1960-х годах. Ведение журналирования абонентских разговоров требовало немалых вычислительных мощностей, в следствие чего программное обеспечение и работа с данными проходили постоянную оптимизацию. Одной из таких оптимизаций и было изменение подхода к журналированию времени операции. Для определения длительности разговора требовалось вычислить разницу между концом разговора и его началом, производились следующие операции: вычислялась разница лет, разница месяцев, разница дней, разница часов, разница минут, разница секунд, после всё приводилось к единому знаменателю - секундам и все данные складывались. Таким образом, если телефонный звонок состоял лишь из нескольких секунд, требовалось провести немалые вычисления.

Для снижения вычислительных затрат была разработана концепция относительного времени, где оно исчисляется секундами относительно начального значения. Для вычисления длительности события требовалось всего-лишь вычесть разницу между меткой времени конца и начала события, а поскольку вычисление реальной даты из относительной производилось только при выдаче распечатки звонков (платной услуге), то нагрузка на оборудование значительно снижалась.

В программном обеспечении концепция относительного времени была реализована в системах Unix конца 1960-х годов 32-ух битным числом с исчислением в 1/60 секунды, что приводило к переполнению числа уже через 2 года и для избежания проблем, предлагалось сбрасывать счётчик в полночь каждого первого января.[3] Такая модель была предложена покольку компьютеры PDP-11, на которых велась разработка системы, имели синхронизацию времени на основании частоты энергообеспечивающей сети (для США — 60гц), что было наиболее точным на тот период[6]. В долгосрочной перспективе этот формат приводил к сбоям в вычислениях: за двухминутный звонок в полночь система могла насчитать абоненту плату за год непрерывного разговора.

В версии 4 Unix, выпущенной в 1973 году, отказались от журналирования событий в долях секунды, так как для учёта событий они не имели принципиального значения. Начальное значение было принято вести от года выпуска первой версии Unix - 1970 года, таким образом охарактеризовав новую эпоху в истории человечества - эпоху UNIX, которая закончится математически в 2038 году[7].

Примечания

Ссылки