Unix-время
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 года.
Примечания
[править | править код]- ↑ General Concepts . pubs.opengroup.org. Дата обращения: 3 ноября 2015. Архивировано 22 декабря 2017 года.
- ↑ UNIX Approaches Ripe Old Age of One Billion . www.electromagnetic.net. Дата обращения: 3 ноября 2015. Архивировано из оригинала 13 апреля 2013 года.
- ↑ The Risks Digest, Volume 21, Issue69 . The Risks Digest. Дата обращения: 3 ноября 2015. Архивировано 22 октября 2015 года.
- ↑ What is the Year 2038 problem? HowStuffWorks. Дата обращения: 3 ноября 2015. Архивировано 9 января 2011 года.
- ↑ New Version of 'January 1, 1970 Bug' Can Brick Pre-iOS 9.3.1 Devices Over Compromised Wi-Fi Networks (13 апреля 2016). Дата обращения: 16 августа 2016. Архивировано 16 августа 2016 года.