Interested Article - Unix-время
- 2020-02-20
- 1
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 .
Каждый день число, представляющее 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 . Для дат, предшествующих началу отсчета, число также возрастает, то есть с течением времени приближается к нулю .
Используемую целочисленную систему удобно использовать для сравнения и хранения дат (дата и время в этом формате занимают всего 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 позиций, что могло сказаться на работе некоторых медицинских приложений .
Главной критической датой с точки зрения Unix-времени считается
19 января
2038 года
в 03:14:08 по всемирному времени, когда значение
переменной
типа
time_t
, отсчитывающей число
секунд
, прошедших с
1 января
1970 года
, достигнет 2
31
, что может привести к ошибочной интерпретации этого числа как
отрицательного
. Комплекс рисков, связанных с этой датой, получил наименование
проблемы 2038 года
. Возможное решение данной проблемы состоит в использовании для хранения времени не 32-
битной
, а 64-битной переменной (что и делается во всех современных 64-битных операционных системах), этого хватит на 292 млрд лет
.
Проблема 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 — теперь на устройстве доступны для установки даты начиная с 1 января 2001 года.
Примечания
- . pubs.opengroup.org. Дата обращения: 3 ноября 2015. 22 декабря 2017 года.
- . www.electromagnetic.net. Дата обращения: 3 ноября 2015. Архивировано из 13 апреля 2013 года.
- . The Risks Digest. Дата обращения: 3 ноября 2015. 22 октября 2015 года.
- HowStuffWorks. Дата обращения: 3 ноября 2015. 9 января 2011 года.
- (13 апреля 2016). Дата обращения: 16 августа 2016. 16 августа 2016 года.
Ссылки
- 2020-02-20
- 1