Unix-время

Материал из Википедии — свободной энциклопедии
(перенаправлено с «UNIX-время»)
Перейти к навигации Перейти к поиску
Unix-время, соответствующее 1 000 000 000 секунд. Дата отмечалась в Копенгагене 9 сентября 2001 г. в 01:46:40 организацией DKUUG (в 03:46:40 по местному времени).

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

Целочисленное представление[править | править код]

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

В момент времени 00:00:00 UTC 1 января 1970 года (четверг) Unix-время равно нулю. Начиная с этого времени, число возрастает на определённое количество в день. Таким образом, к примеру, 16 сентября 2004 года в 00:00:00, спустя 12677 дней после начала отсчета Unix-времени, время будет представлено числом 12677 × 86400 = 1095292800. Расчеты могут быть также произведены в обратном направлении используя отрицательные числа. К примеру, дата 4 октября 1957 года 00:00:00, а это 4472 дня до начала отсчета представлена в Unix-времени числом −4472 × 86400 = −386380800[1].

Каждый день число, представляющее Unix-время, вычисляется описанным образом в UTC (00:00:00Z), и увеличивается ровно на 1 в секунду, начиная с полночи. Следовательно, 16-09-2004 17:55:43.54, 64543.54 секунд с полуночи, из примера выше, будет представлено в Unix-времени числом 1095292800 + 64543.54 = 1095357343.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, −2147483648 секунд от 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, но у проблемы есть три решения другими способами. Первый способ: просто оставить включенным устройство и ждать пока счётчик Unix-времени уйдёт в плюс (пока не доказано, что данный способ работает). Второй способ: ждать пока аккумулятор телефона сядет полностью и счётчик сам сбросится на нулевое состояние. Третий способ: разобрать устройство и отключить аккумулятор на некоторое время, затем собрать устройство, счётчик также сбросится на ноль и устройство будет работать.

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

Программная конвертация[править | править код]

Приводится пример реализации на языке Си функций конвертации между Unix-временем и обычным представлением в виде даты и времени суток. Пример приведен в стандартном знаковом 32-бит формате. Однако, если закомментировать определение _XT_SIGNED, пример соберется в беззнаковом варианте.


Примечания[править | править код]

  1. General Concepts. pubs.opengroup.org. Проверено 3 ноября 2015.
  2. UNIX Approaches Ripe Old Age of One Billion  (недоступная ссылка — история). www.electromagnetic.net. Проверено 3 ноября 2015. Архивировано 13 апреля 2013 года.
  3. The Risks Digest, Volume 21, Issue69. The Risks Digest. Проверено 3 ноября 2015.
  4. What is the Year 2038 problem?. HowStuffWorks. Проверено 3 ноября 2015.
  5. New Version of 'January 1, 1970 Bug' Can Brick Pre-iOS 9.3.1 Devices Over Compromised Wi-Fi Networks (13 апреля 2016). Проверено 16 августа 2016.

Ссылки[править | править код]