Unix-время
1721900661
( ) 2024-07-25T09:44:21+00:00
Unix-время [а] представляет собой представление даты и времени, широко используемое в вычислительной технике . Он измеряет время по количеству невисокосных секунд , прошедших с 00:00:00 UTC 1 января 1970 года, эпохи Unix . В современных вычислениях значения иногда сохраняются с более высокой степенью детализации , например, в микросекундах или наносекундах .
Время Unix возникло как системное время операционных систем Unix . Он стал широко использоваться в других компьютерных операционных системах , файловых системах , языках программирования и базах данных .
Определение
[ редактировать ]Время Unix в настоящее время определяется как количество невисокосных секунд, прошедших с 00:00:00 UTC в четверг, 1 января 1970 года, что называется Unix эпохой . [3] Время в Unix обычно кодируется как целое число со знаком .
Время Unix 0 — это ровно полночь по всемирному координированному времени 1 января 1970 года, причем время Unix увеличивается на 1 за каждую невисокосную секунду после этого. Например, 00:00:00 UTC 1 января 1971 года представлено по времени Unix как 31 536 000 . Отрицательные значения в системах, которые их поддерживают, указывают время до начала эпохи Unix, причем значение уменьшается на 1 за каждую невисокосную секунду перед эпохой. Например, 00:00:00 UTC 1 января 1969 года представлено по времени Unix как −31 536 000 . Каждый день в Unix-времени состоит ровно из 86 400 секунд.
Время Unix иногда называют временем эпохи . Это может ввести в заблуждение, поскольку время Unix — не единственная система времени, основанная на эпохе, а эпоха Unix — не единственная эпоха, используемая другими системами времени. [5]
Дополнительные секунды
[ редактировать ]Время Unix отличается как от всемирного координированного времени (UTC), так и от международного атомного времени (TAI) обработкой дополнительных секунд . UTC включает дополнительные секунды, которые корректируют несоответствие между точным временем, измеренным атомными часами , и солнечным временем , связанным с положением Земли по отношению к Солнцу. Международное атомное время (TAI), в котором каждый день длится ровно 86 400 секунд, игнорирует солнечное время и постепенно теряет синхронизацию с вращением Земли со скоростью примерно одну секунду в год. По времени Unix каждый день содержит ровно 86 400 секунд. Каждая дополнительная секунда использует временную метку секунды, которая непосредственно предшествует ей или следует за ней. [3]
В обычный день по всемирному координированному времени, продолжительность которого составляет 86 400 секунд, число времени Unix непрерывно меняется в полночь. Например, в конце дня, использованного в приведенных выше примерах, представления времени развиваются следующим образом:
ЭТО (17 сентября 2004 г.) | UTC (16–17 сентября 2004 г.) | Unix-время |
---|---|---|
2004-09-17T00:00:30.75 | 2004-09-16T23:59:58.75 | 1 095 379 198 .75 |
2004-09-17T00:00:31.00 | 2004-09-16T23:59:59.00 | 1 095 379 199 .00 |
2004-09-17T00:00:31.25 | 2004-09-16T23:59:59.25 | 1 095 379 199 .25 |
2004-09-17T00:00:31.50 | 2004-09-16T23:59:59.50 | 1 095 379 199 .50 |
2004-09-17T00:00:31.75 | 2004-09-16T23:59:59.75 | 1 095 379 199 .75 |
2004-09-17T00:00:32.00 | 2004-09-17T00:00:00.00 | 1 095 379 200 .00 |
2004-09-17T00:00:32.25 | 2004-09-17T00:00:00.25 | 1 095 379 200 .25 |
2004-09-17T00:00:32.50 | 2004-09-17T00:00:00.50 | 1 095 379 200 .50 |
2004-09-17T00:00:32.75 | 2004-09-17T00:00:00.75 | 1 095 379 200 .75 |
2004-09-17T00:00:33.00 | 2004-09-17T00:00:01.00 | 1 095 379 201 .00 |
2004-09-17T00:00:33.25 | 2004-09-17T00:00:01.25 | 1 095 379 201 .25 |
Когда возникает високосная секунда , продолжительность дня UTC не составляет точно 86 400 секунд, и число времени Unix (которое всегда увеличивается ровно на 86 400 каждый день) испытывает разрыв . Дополнительные секунды могут быть положительными или отрицательными. Никакая отрицательная дополнительная секунда никогда не объявлялась, но если бы она была объявлена, то в конце дня с отрицательной дополнительной секундой число времени Unix подскочило бы на 1 к началу следующего дня. Во время положительной дополнительной секунды в конце дня, которая происходит в среднем каждые полтора года, число времени Unix непрерывно увеличивается до следующего дня в течение дополнительной секунды, а затем в конце дополнительной секунды возвращается на 1. (возвращаясь к началу следующего дня). Например, вот что произошло в системах, строго соответствующих POSIX.1 , в конце 1998 года:
ТАЙ (1 января 1999 г.) | UTC (31 декабря 1998 г. - 1 января 1999 г.) | Unix-время |
---|---|---|
1999-01-01T00:00:29.75 | 1998-12-31T23:59:58.75 | 915 148 798 .75 |
1999-01-01T00:00:30.00 | 1998-12-31T23:59:59.00 | 915 148 799 .00 |
1999-01-01T00:00:30.25 | 1998-12-31T23:59:59.25 | 915 148 799 .25 |
1999-01-01T00:00:30.50 | 1998-12-31T23:59:59.50 | 915 148 799 .50 |
1999-01-01T00:00:30.75 | 1998-12-31T23:59:59.75 | 915 148 799 .75 |
1999-01-01T00:00:31.00 | 1998-12-31T23:59:60.00 | 915 148 800 .00 |
1999-01-01T00:00:31.25 | 1998-12-31T23:59:60.25 | 915 148 800 .25 |
1999-01-01T00:00:31.50 | 1998-12-31T23:59:60.50 | 915 148 800 .50 |
1999-01-01T00:00:31.75 | 1998-12-31T23:59:60.75 | 915 148 800 .75 |
1999-01-01T00:00:32.00 | 1999-01-01T00:00:00.00 | 915 148 800 .00 |
1999-01-01T00:00:32.25 | 1999-01-01T00:00:00.25 | 915 148 800 .25 |
1999-01-01T00:00:32.50 | 1999-01-01T00:00:00.50 | 915 148 800 .50 |
1999-01-01T00:00:32.75 | 1999-01-01T00:00:00.75 | 915 148 800 .75 |
1999-01-01T00:00:33.00 | 1999-01-01T00:00:01.00 | 915 148 801 .00 |
1999-01-01T00:00:33.25 | 1999-01-01T00:00:01.25 | 915 148 801 .25 |
Числа времени Unix повторяются сразу после положительной дополнительной секунды. Таким образом, число времени Unix 1 483 142 400 неоднозначно: оно может относиться либо к началу дополнительной секунды (2016-12-31 23:59:60), либо к ее концу, на одну секунду позже (2017-01-01 00). :00:00). В теоретическом случае, когда возникает отрицательная дополнительная секунда, никакой двусмысленности не возникает, а вместо этого существует диапазон чисел времени Unix, которые вообще не относятся ни к какой точке времени UTC.
Часы Unix часто реализуются с другим типом обработки положительной дополнительной секунды, связанной с протоколом сетевого времени (NTP). В результате получается система, не соответствующая стандарту POSIX. Подробности см. в разделе ниже, посвященном NTP.
При работе с периодами, которые не включают в себя дополнительную секунду UTC, разница между двумя числами времени Unix равна продолжительности в секундах периода между соответствующими моментами времени. Это распространенный вычислительный метод. Однако там, где встречаются високосные секунды, такие расчеты дают неправильный ответ. В приложениях, где требуется такой уровень точности, при работе со временем Unix необходимо обращаться к таблице дополнительных секунд, и часто предпочтительнее использовать другую кодировку времени, которая не страдает от этой проблемы.
Число времени Unix легко конвертируется обратно во время UTC, взяв частное и модуль числа времени Unix по модулю 86 400 . Частное — это количество дней, прошедших с эпохи, а модуль — это количество секунд с полуночи по всемирному координированному времени в этот день. Если задано число времени Unix, которое неоднозначно из-за положительной дополнительной секунды, этот алгоритм интерпретирует его как время сразу после полуночи. Он никогда не генерирует время, находящееся в пределах дополнительной секунды. Если задано число времени Unix, которое является недопустимым из-за отрицательной дополнительной секунды, оно генерирует столь же недопустимое время UTC. Если эти условия существенны, необходимо свериться с таблицей високосных секунд, чтобы обнаружить их.
Вариант на основе несинхронного протокола сетевого времени
[ редактировать ]Обычно часы Unix в стиле Миллса реализуются с обработкой секунды координации, не синхронной с изменением номера времени Unix. Число времени сначала уменьшается там, где должен был произойти скачок, а затем увеличивается до правильного времени через 1 секунду после скачка. Это упрощает реализацию и описано в статье Миллса. [6] Вот что происходит через положительную дополнительную секунду:
ТАЙ (1 января 1999 г.) | UTC (31 декабря 1998 г. - 1 января 1999 г.) | Состояние | Unix-часы |
---|---|---|---|
1999-01-01T00:00:29.75 | 1998-12-31T23:59:58.75 | TIME_INS | 915 148 798 .75 |
1999-01-01T00:00:30.00 | 1998-12-31T23:59:59.00 | TIME_INS | 915 148 799 .00 |
1999-01-01T00:00:30.25 | 1998-12-31T23:59:59.25 | TIME_INS | 915 148 799 .25 |
1999-01-01T00:00:30.50 | 1998-12-31T23:59:59.50 | TIME_INS | 915 148 799 .50 |
1999-01-01T00:00:30.75 | 1998-12-31T23:59:59.75 | TIME_INS | 915 148 799 .75 |
1999-01-01T00:00:31.00 | 1998-12-31T23:59:60.00 | TIME_INS | 915 148 800 .00 |
1999-01-01T00:00:31.25 | 1998-12-31T23:59:60.25 | TIME_OOP | 915 148 799 .25 |
1999-01-01T00:00:31.50 | 1998-12-31T23:59:60.50 | TIME_OOP | 915 148 799 .50 |
1999-01-01T00:00:31.75 | 1998-12-31T23:59:60.75 | TIME_OOP | 915 148 799 .75 |
1999-01-01T00:00:32.00 | 1999-01-01T00:00:00.00 | TIME_OOP | 915 148 800 .00 |
1999-01-01T00:00:32.25 | 1999-01-01T00:00:00.25 | TIME_WAIT | 915 148 800 .25 |
1999-01-01T00:00:32.50 | 1999-01-01T00:00:00.50 | TIME_WAIT | 915 148 800 .50 |
1999-01-01T00:00:32.75 | 1999-01-01T00:00:00.75 | TIME_WAIT | 915 148 800 .75 |
1999-01-01T00:00:33.00 | 1999-01-01T00:00:01.00 | TIME_WAIT | 915 148 801 .00 |
1999-01-01T00:00:33.25 | 1999-01-01T00:00:01.25 | TIME_WAIT | 915 148 801 .25 |
Это можно правильно расшифровать, обратив внимание на переменную состояния секунды координации, которая однозначно указывает, был ли уже выполнен прыжок. Изменение переменной состояния синхронно со скачком.
Аналогичная ситуация возникает с отрицательной дополнительной секундой, когда пропущенная секунда немного запаздывает. Очень кратко система показывает номинально невозможное число времени, но это можно обнаружить по состоянию TIME_DEL и исправить.
В системах этого типа число времени Unix нарушает POSIX в отношении обоих типов дополнительных секунд. Сбор переменной состояния секунды координации вместе с номером времени обеспечивает однозначное декодирование, поэтому при желании можно сгенерировать правильный номер времени POSIX или сохранить полное время UTC в более подходящем формате.
Логика декодирования, необходимая для работы с часами Unix этого типа, также будет правильно декодировать гипотетические часы, соответствующие POSIX, с использованием того же интерфейса. Этого можно достичь, указав состояние TIME_INS в течение всей вставленной дополнительной секунды, а затем указав TIME_WAIT в течение всей следующей секунды, повторяя отсчет секунд. Это требует синхронной обработки секунды координации. Вероятно, это лучший способ выразить время UTC в форме часов Unix через интерфейс Unix, когда базовые часы принципиально не подвержены високосным секундам.
Вариант, учитывающий високосные секунды.
[ редактировать ]Другой, гораздо более редкий и несоответствующий вариант учета времени в Unix включает увеличение значения всех секунд, включая дополнительные секунды; [7] некоторые системы Linux настроены таким образом. [8] Время, сохраняемое таким образом, иногда называют «TAI» (хотя временные метки могут быть преобразованы в UTC, если значение соответствует времени, когда известна разница между TAI и UTC), в отличие от «UTC» (хотя не все UTC значения времени имеют уникальную ссылку в системах, которые не учитывают дополнительные секунды). [8]
Поскольку в TAI нет дополнительных секунд, а длина каждого дня TAI составляет ровно 86400 секунд, эта кодировка на самом деле представляет собой чистый линейный отсчет секунд, прошедших с 1970-01-01T00:00:10 TAI. Это значительно упрощает арифметику временных интервалов. Значения времени из этих систем не страдают от двусмысленности, которая свойственна строго соответствующим системам POSIX или системам, управляемым NTP.
В этих системах необходимо свериться с таблицей дополнительных секунд, чтобы правильно преобразовать время в формате UTC и представление псевдо-Unix-времени. Это похоже на то, как необходимо обращаться к таблицам часовых поясов для перехода на гражданское время и обратно ; База данных часовых поясов IANA включает информацию о секундах координации, а пример кода, доступный из того же источника, использует эту информацию для преобразования временных меток на основе TAI и местного времени. Преобразование также сталкивается с проблемами определений до введения в 1972 году нынешней формы UTC (см. раздел « Основы UTC» ниже).
Эта система, несмотря на внешнее сходство, не является эпохой Unix. Он кодирует время со значениями, которые на несколько секунд отличаются от значений времени POSIX. Версия этой системы, в которой эпоха была 1970-01-01T00:00:00 TAI, а не 1970-01-01T00:00:10 TAI, была предложена для включения в ISO C. time.h
, но в 2011 году была принята только часть UTC. [9] А tai_clock
однако существует в C++20.
Представление числа
[ редактировать ]Число времени Unix может быть представлено в любой форме, допускающей представление чисел. В некоторых приложениях число просто представляется в текстовом виде в виде строки десятичных цифр, что вызывает лишь тривиальные дополнительные проблемы. Однако некоторые двоичные представления времени Unix особенно важны.
Юникс time_t
тип данных, который представляет момент времени, на многих платформах представляет собой целое число со знаком , традиционно состоящее из 32 бит (но см. ниже), непосредственно кодирующее число времени Unix, как описано в предыдущем разделе. 32-битное значение со знаком охватывает примерно 68 лет до и после эпохи 1970-01-01. Минимальная представимая дата — пятница 13 декабря 1901 г., а максимальная представимая дата — вторник 19 января 2038 г. Через одну секунду после 03:14:07 UTC 19 января 2038 года это представление переполнится, что приведет к так называемой проблеме 2038 года .
В некоторых новых операционных системах time_t
был расширен до 64 бит. Это расширяет представимые времена примерно до 292,3 миллиарда лет в обоих направлениях, что более чем в двадцать раз превышает нынешний возраст Вселенной .
Первоначально существовали некоторые разногласия по поводу того, является ли Unix time_t
должен быть подписан или не подписан. Если он без знака, его диапазон в будущем будет увеличен вдвое, что отложит 32-битное переполнение (на 68 лет). Однако тогда он был бы неспособен отображать времена, предшествовавшие эпохе. Консенсус для time_t
подписать, и это обычная практика. Платформа разработки программного обеспечения для версии 6 операционной системы QNX имеет беззнаковый 32-битный time_t
, хотя в более старых версиях использовался подписанный тип.
Спецификации POSIX , которая включает и Open Group Unix включают стандартную библиотеку C типы времени и функции, определенные в <time.h>
заголовочный файл. Стандарт ISO C гласит, что time_t
должен быть арифметическим типом, но не требует для него какого-либо конкретного типа или кодировки. POSIX требует time_t
быть целочисленным типом, но не требует, чтобы он был знаковым или беззнаковым.
В Unix нет традиции прямого представления нецелых чисел времени Unix в виде двоичных дробей. Вместо этого время с точностью до секунды представляется с использованием составных типов данных , состоящих из двух целых чисел, первое из которых представляет собой time_t
(целая часть времени Unix), а вторая — дробная часть числа времени в миллионных долях (в struct timeval
) или миллиардные доли (в struct timespec
). [10] [11] Эти структуры обеспечивают десятичный формат данных с фиксированной запятой , который полезен для некоторых приложений и прост в преобразовании для других.
Базис UTC
[ редактировать ]Нынешняя форма UTC с дополнительными секундами определяется только начиная с 1 января 1972 года. До этого, с 1 января 1961 года, существовала более старая форма UTC, в которой не только были случайные временные шаги, которые были нецелыми числами. числа секунд, но также секунда UTC была немного длиннее секунды SI и периодически менялась, чтобы постоянно аппроксимировать вращение Земли. До 1961 года не было UTC, а до 1958 года не было широко распространенного атомного хронометража ; в эти эпохи вместо атомной шкалы времени использовалась некоторая аппроксимация GMT (основанная непосредственно на вращении Земли). [ нужна ссылка ]
Точное определение времени Unix как кодировки UTC является бесспорным только применительно к нынешней форме UTC. Эпоха Unix, предшествовавшая появлению этой формы UTC, не влияет на ее использование в эту эпоху: количество дней с 1 января 1970 года (эпоха Unix) по 1 января 1972 года (начало UTC) не подлежит сомнению, а количество дней — это все, что имеет значение для времени Unix.
Значение значений времени Unix ниже +63 072 000 (т. е. до 1 января 1972 г.) точно не определено. Основу такого времени Unix лучше всего понимать как неопределенное приближение к UTC. Компьютеры той эпохи редко имели достаточно точные настройки часов, чтобы обеспечить значимые временные метки с точностью до секунды. Время Unix не является подходящим способом представления времени до 1972 года в приложениях, требующих точности до доли секунды; такие приложения должны, по крайней мере, определять, какую форму UT или GMT они используют.
По состоянию на 2009 год [update]рассматривается возможность прекращения использования дополнительных секунд в гражданском времени. [12] Вероятным способом реализации этого изменения является определение новой шкалы времени, называемой международным временем. [ нужна ссылка ] , который первоначально соответствует UTC, но после этого не имеет дополнительных секунд, поэтому остается с постоянным смещением от TAI. Если это произойдет, вполне вероятно, что время Unix будет в будущем определяться в рамках этой новой шкалы времени, а не в формате UTC. Неопределенность относительно того, произойдет ли это, делает будущее время Unix не менее предсказуемым, чем оно есть сейчас: если бы у UTC просто не было дополнительных дополнительных секунд, результат был бы таким же.
История
[ редактировать ]Этот раздел нуждается в дополнительных цитатах для проверки . ( сентябрь 2019 г. ) |
Самые ранние версии времени Unix имели 32-битное целое число, увеличивающееся со скоростью 60 Гц , что было частотой системных часов на аппаратном обеспечении ранних систем Unix. Временные метки, хранящиеся таким образом, могут представлять собой диапазон чуть более двух с четвертью лет. Эпоха, от которой ведется отсчет, была изменена в выпусках Unix, чтобы предотвратить переполнение: полночь 1 января 1971 года и 1 января 1972 года использовались в качестве эпох на ранней стадии разработки Unix. В ранних определениях времени Unix также не было часовых поясов. [13] [14]
Текущая эпоха 1 января 1970 года 00:00:00 UTC была выбрана инженерами Unix произвольно, поскольку считалась удобной датой для работы. Точность была изменена на счет в секундах, чтобы избежать кратковременного переполнения. [1]
Когда был написан POSIX.1 , возник вопрос, как точно определить time_t
перед лицом дополнительных секунд. Комитет POSIX рассмотрел вопрос о том, должно ли время Unix оставаться, как предполагалось, линейным отсчетом секунд с начала эпохи, за счет сложности преобразований с гражданским временем или представления гражданского времени, за счет несогласованности вокруг дополнительных секунд. Компьютерные часы той эпохи не были настроены достаточно точно, чтобы тем или иным образом создать прецедент.
На комитет POSIX повлияли аргументы против сложности библиотечных функций. [ нужна ссылка ] и четко определил время Unix простым способом с точки зрения элементов времени UTC. Это определение было настолько простым, что оно даже не охватывало все правило високосного года григорианского календаря и делало 2100 год високосным.
Версия POSIX.1 2001 года исправила ошибочное правило високосного года в определении времени Unix, но сохранило основное определение времени Unix как кодировки UTC, а не линейной шкалы времени. С середины 1990-х годов компьютерные часы регулярно устанавливались с достаточной точностью, чтобы это имело значение, и чаще всего они устанавливались с использованием определения времени Unix на основе UTC. Это привело к значительной сложности в реализациях Unix и в протоколе сетевого времени для выполнения шагов в номере времени Unix всякий раз, когда возникают високосные секунды. [ нужна ссылка ]
Использование
[ редактировать ]Время Unix широко применяется в вычислительной технике, помимо своего первоначального применения в качестве системного времени для Unix . Время Unix доступно практически во всех API-интерфейсах на основе Unix, так и не-Unix системного программирования, включая те, которые предоставляются как операционными системами . Почти все современные языки программирования предоставляют API для работы со временем Unix или преобразования его в другую структуру данных. Время Unix также используется как механизм хранения временных меток в ряде файловых систем , форматов файлов и баз данных .
Стандартная библиотека C использует время Unix для всех функций даты и времени, а время Unix иногда называют time_t — именем типа данных , используемого для меток времени в C и C++ . Функции времени Unix языка C определены как API системного времени в спецификации POSIX . [15] Стандартная библиотека C широко используется во всех современных настольных операционных системах, включая Microsoft Windows и Unix-подобные системы, такие как macOS и Linux , где она является стандартным интерфейсом программирования. [16] [17] [18]
iOS предоставляет Swift API, который по умолчанию использует эпоху 1 января 2001 года, но также может использоваться с временными метками Unix. [19] Android использует время Unix вместе с часовым поясом для своего API системного времени. [20]
Windows не использует время Unix для внутреннего хранения времени, но использует его в системных API, которые предоставляются на C++ и реализуют спецификацию стандартной библиотеки C. [16] Время Unix используется в формате PE для исполняемых файлов Windows. [21]
Время Unix обычно доступно в основных языках программирования и широко используется в программировании настольных, мобильных и веб-приложений. Java предоставляет объект Instant, который содержит временную метку Unix как в секундах, так и в наносекундах. [22] Python предоставляет библиотеку времени, которая использует время Unix. [23] JavaScript предоставляет библиотеку дат, которая предоставляет и хранит временные метки в миллисекундах, начиная с эпохи Unix, и реализована во всех современных настольных и мобильных веб-браузерах , а также в серверных средах JavaScript таких как Node.js. , [24]
Файловые системы, предназначенные для использования с операционными системами на базе Unix, обычно используют время Unix. APFS , файловая система, используемая по умолчанию на всех устройствах Apple, и ext4 , которая широко используется на устройствах Linux и Android, используют время Unix в наносекундах для отметок времени файла. [25] [26] Несколько форматов архивных файлов могут хранить временные метки в формате Unix, включая RAR и tar . [27] [28] Время Unix также часто используется для хранения временных меток в базах данных, в том числе в MySQL и PostgreSQL . [29] [30]
Ограничения
[ редактировать ]Время Unix было разработано для компактного кодирования календарных дат и времени и предназначено для внутреннего использования компьютерами. Он не предназначен для легкого чтения людьми или для хранения значений, зависящих от часового пояса. По умолчанию он также ограничен представлением времени в секундах, что делает его непригодным для использования, когда требуется более точное измерение времени, например, при измерении времени выполнения программ. [31]
Диапазон представимых времен
[ редактировать ]Время Unix по своей природе не требует определенного размера хранилища, но в наиболее распространенных реализациях времени Unix используется целое число со знаком того же размера, что и размер слова базового оборудования. Поскольку большинство современных компьютеров являются 32-битными или 64-битными , а большое количество программ по-прежнему написано в 32-битном режиме совместимости, это означает, что многие программы, использующие время Unix, используют подписанные 32-битные целочисленные поля. Максимальное значение 32-битного целого числа со знаком равно 2. 31 − 1 , а минимальное значение равно −2 31 , что делает невозможным представление дат до 13 декабря 1901 года (в 20:45:52 UTC) или после 19 января 2038 года (в 03:14:07 UTC). Раннее отключение может повлиять на базы данных, в которых хранится историческая информация; в некоторых базах данных, где для временных меток используется 32-битное время Unix, может потребоваться хранить время в поле другой формы, например в строке, для представления дат до 1901 года. Позднее отсечение известно как проблема 2038 года и может вызвать проблемы по мере приближения даты, поскольку даты, выходящие за пределы отсечки 2038 года, вернутся к началу представимого диапазона в 1901 году. [31] : 60
Ограничения диапазона дат не являются проблемой для 64-битных представлений времени Unix, поскольку эффективный диапазон дат, которые можно представить с помощью времени Unix, хранящегося в 64-битном целом со знаком, составляет более 584 миллиардов лет, или 292 миллиарда лет в любом направлении от 1970 года. эпоха. [31] : 60-61 [32]
Альтернативы
[ редактировать ]Время Unix — не единственный стандарт времени, отсчитываемый от эпохи. В Windows FILETIME
type хранит время как количество 100-наносекундных интервалов, прошедших с 0:00 по Гринвичу 1 января 1601 года. [33] Время эпохи Windows используется для хранения временных меток файлов. [34] и в таких протоколах, как Active Directory. служба времени [35] и Блок сообщений сервера .
Протокол сетевого времени, используемый для координации времени между компьютерами, использует эпоху 1 января 1900 года, рассчитываемую 32-битным целым числом без знака для секунд и другим 32-битным целым числом без знака для дробных секунд, которое меняется каждые 2 секунды. 32 секунд (примерно раз в 136 лет). [36]
Многие приложения и языки программирования предоставляют методы хранения времени с явным указанием часового пояса. [37] Существует также ряд стандартов формата времени, которые доступны для чтения как людям, так и компьютерам, например ISO 8601 .
Известные события во времена Unix
[ редактировать ]Энтузиасты Unix имеют историю проведения «вечеринок time_t» (произносится как « чаепития времени »), чтобы отметить значительные значения временного числа Unix. [38] [39] Они напрямую аналогичны празднованию Нового года , которое происходит во многих календарях при смене года. По мере распространения использования Unix росла и практика празднования ее вех. Обычно значения времени, представляющие собой круглые десятичные числа , отмечаются в соответствии с соглашением о просмотре Unix. time_t
значения в десятичном формате. Среди некоторых групп отмечаются также круглые двоичные числа, например +2. 30 которое произошло в 13:37:04 UTC в субботу, 10 января 2004 г. [ нужна ссылка ]
События, которые они отмечают, обычно описываются как « N секунд с эпохи Unix», но это неточно; как обсуждалось выше, из-за обработки високосных секунд во времени Unix количество секунд, прошедших с момента начала эпохи Unix, немного больше, чем число времени Unix, для времен, более поздних, чем эпоха.
- В 18:36:57 UTC в среду, 17 октября 1973 г., впервые появилась дата в ISO 8601. формате [б] (1973-10-17) в пределах цифр Unix-времени (119731017).
- двухлетие Unix (временной номер Unix 1 000 000 000 ). В 01:46:40 UTC в воскресенье, 9 сентября 2001 г., отмечалось [40] Название «биллениум» представляет собой смесь слов « миллиард» и «тысячелетие» . [41] [42] Некоторые программы, которые сохраняли временные метки с использованием текстового представления, сталкивались с ошибками сортировки, например, при сортировке текста: времена после оборота, начинающегося с 1-й цифры, ошибочно сортировались раньше, чем более ранние времена, начинающиеся с 9-й цифры. Затронутые программы включали популярную Usenet программу чтения KNode и электронной почты клиент KMail , входящие в состав среды рабочего стола KDE . Такие ошибки обычно носили косметический характер и быстро исправлялись, как только проблемы становились очевидными. [ нужна ссылка ] Проблема также затронула многие Filtrix фильтры формата документов для Linux , поставляемые с версиями WordPerfect ; Сообществом пользователей был создан патч для решения этой проблемы, поскольку Corel больше не продавала и не поддерживала эту версию программы. [43]
- В 23:31:30 UTC в пятницу, 13 февраля 2009 г., десятичное представление времени Unix достигло 1 234 567 890 секунд. [44] Google отпраздновал это дудлом Google . [45] Вечеринки и другие торжества прошли по всему миру, среди различных технических субкультур, в честь 1 234 567 890 -й секунды. [38] [46]
В популярной культуре
[ редактировать ]Вернора Винджа В романе «Глубина в небе» описывается космическая торговая цивилизация, живущая через тысячи лет в будущем, которая до сих пор использует эпоху Unix. « Программист-археолог », ответственный за поиск и поддержание пригодного для использования кода в зрелых компьютерных системах, сначала полагает, что эта эпоха относится к тому времени, когда человек впервые ступил на Луну , но затем понимает, что это «0-секунда одного из первых событий человечества». компьютерные операционные системы». [47]
См. также
[ редактировать ]Примечания
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: Перейти обратно: а б Фархад, Манджу (8 сентября 2001 г.). «Тик Unix достигает миллиарда» . Проводной . ISSN 1059-1028 . Архивировано из оригинала 11 сентября 2022 года . Проверено 16 октября 2022 г.
- ^ «Базовые спецификации открытой группы, выпуск 7, Обоснование: базовые определения, раздел A.4 Общие понятия» . Открытая группа . Архивировано из оригинала 15 ноября 2017 года . Проверено 9 сентября 2019 г.
- ^ Jump up to: Перейти обратно: а б с «Базовые спецификации открытой группы, выпуск 7, раздел 4.16 Секунды с начала эпохи» . Открытая группа . Архивировано из оригинала 22 декабря 2017 года . Проверено 22 января 2017 г.
- ^ Мэтью, Нил; Стоунз, Ричард (2008). «Среда Linux». Начало программирования Linux . Индианаполис, Индиана, США: Уайли. п. 148. ИСБН 978-0-470-14762-7 .
- ^ «Структура FILETIME (minwinbase.h)» . Документы Майкрософт . 2 апреля 2021 г.
- ^ Миллс, Дэвид Л. (12 мая 2012 г.). «Временная шкала NTP и високосные секунды» . eecis.udel.edu . Архивировано из оригинала 15 мая 2012 года . Проверено 21 августа 2017 г.
- ^ «Точный хронометраж» . Источники данных о часовом поясе и летнем времени . Архивировано из оригинала 16 октября 2017 года . Проверено 30 мая 2022 г.
Код и данные tz поддерживают високосные секунды посредством дополнительной «правой» конфигурации, в которой внутренние целочисленные часы time_t компьютера отсчитывают каждую секунду TAI, в отличие от конфигурации «posix» по умолчанию, в которой внутренние часы игнорируют високосные секунды. Две конфигурации совпадают для временных меток, начинающихся с 1972-01-01 00:00:00 UTC (time_t 63 072 000), и расходятся для временных меток, начинающихся с time_t 78 796 800, что соответствует первой дополнительной секунде 1972-06-30 23: 59:60 UTC в «правильной» конфигурации и до 01.07.1972 00:00:00 UTC в конфигурации «posix».
- ^ Jump up to: Перейти обратно: а б «Временные весы» . Wiki протокола сетевого времени . 24 июля 2019 года. Архивировано из оригинала 12 января 2020 года . Проверено 12 января 2020 г.
- ^ Маркус Кун. «Модернизированный API для ISO C» . www.cl.cam.ac.uk. Архивировано из оригинала 26 сентября 2020 года . Проверено 31 августа 2020 г.
- ^ «указ времени» . Страницы руководства NetBSD . 12 апреля 2011 г. Архивировано из оригинала 10 августа 2019 г. . Проверено 5 июля 2019 г.
- ^ "время.ч(0P)" . Страница руководства по Linux . Архивировано из оригинала 27 июня 2019 года . Проверено 5 июля 2019 г.
- ^ Маккарти, Д.Д. ; Зайдельманн, ПК (2009). ВРЕМЯ — От вращения Земли до атомной физики . Вайнхайм: Wiley – VCH Verlag GmbH & Co. KGaA. п. 232. ИСБН 978-3-527-40780-4 .
- ^ Руководство программиста Unix (PDF) (1-е изд.). 3 ноября 1971 г. Архивировано (PDF) из оригинала 5 марта 2022 г. . Проверено 28 марта 2012 г.
time возвращает время с 00:00:00 1 января 1971 года, измеренное в шестидесятых долях секунды.
- ^ Руководство программиста Unix (PDF) (3-е изд.). 15 марта 1972 года. Архивировано (PDF) из оригинала 12 февраля 2023 года . Проверено 11 февраля 2023 г.
time возвращает время с 00:00:00 1 января 1972 года, измеренное в шестидесятых долях секунды... Время хранится в 32 битах. Это гарантирует кризис каждые 2,26 года.
- ^ «Базовые спецификации технических стандартов Open Group, выпуск 7 (издание 2018 г.)» . IEEE и Открытая группа. Архивировано из оригинала 1 мая 2023 года . Проверено 1 мая 2023 г.
- ^ Jump up to: Перейти обратно: а б «время, _time32, _time64» . Learn.microsoft.net . Корпорация Майкрософт. 13 февраля 2023 года. Архивировано из оригинала 1 мая 2023 года . Проверено 1 мая 2023 г.
- ^ «Библиотека GNU C (glibc)» . GNU Operation Sisyem . Фонд свободного программного обеспечения. Архивировано из оригинала 22 апреля 2016 года . Проверено 1 мая 2023 г.
Проект GNU C Library предоставляет основные библиотеки для систем GNU и GNU/Linux, а также для многих других систем, использующих Linux в качестве ядра.
- ^ «Страница руководства Mac OS X для localtime(3)» . Архив документации Apple . Apple Inc. Архивировано из оригинала 22 июля 2022 года . Проверено 1 мая 2023 г.
- ^ «НСДата» . Документация разработчика Apple . Apple Inc. Архивировано из оригинала 1 мая 2023 года . Проверено 1 мая 2023 г.
- ^ «Обзор времени» . Проект Android с открытым исходным кодом . ООО Гугл. Архивировано из оригинала 1 мая 2023 года . Проверено 1 мая 2023 г.
- ^ «Формат PE — приложения Win32» . Learn.microsoft.com . Корпорация Майкрософт. 24 марта 2023 года. Архивировано из оригинала 29 апреля 2023 года . Проверено 1 мая 2023 г.
- ^ «Мгновенный (платформа Java SE 8)» . docs.oracle.com . Оракул. Архивировано из оригинала 25 ноября 2016 года . Проверено 1 мая 2023 г.
- ^ «время — доступ ко времени и преобразования» , документация Python , заархивировано из оригинала 22 июля 2022 г. , получено 25 июля 2022 г.
- ^ «Дата — JavaScript | MDN» . http://developer.mozilla.org . Мозилла. Архивировано из оригинала 21 июля 2021 года . Проверено 1 мая 2023 г.
- ^ Справочник по файловой системе Apple (PDF) , стр. 57, заархивировано (PDF) из оригинала 5 ноября 2022 г. , получено 19 октября 2022 г. Эта
временная метка представлена как количество наносекунд с 1 января 1970 г. в 0:00 UTC, без учета дополнительных секунд.
- ^ «Структуры данных и алгоритмы» . Документация ядра Linux . Linux Kernel Organization, Inc. Архивировано из оригинала 1 мая 2023 года . Проверено 1 мая 2023 г.
- ^ «Формат архива RAR 5.0» . www.rarlab.com . Win.rar GmbH. Архивировано из оригинала 1 мая 2023 года . Проверено 1 мая 2023 г.
Время сохраняется в формате Unix time_t, если этот флаг [sic] установлен, и в формате Windows FILETIME в противном случае.
- ^ «Семейство форматов файлов ленточного архива (tar)» . www.loc.gov . Библиотека Конгресса. 7 января 2021 г. Архивировано из оригинала 1 мая 2023 г. Проверено 1 мая 2023 г.
- ^ «Функции даты и времени» , Справочное руководство MySQL 8.0 , заархивировано из оригинала 19 октября 2022 г. , получено 19 октября 2022 г.
- ^ «8.5. Типы даты/времени» . Документация PostgreSQL . Группа глобального развития PostgreSQL. 9 февраля 2023 года. Архивировано из оригинала 1 мая 2023 года . Проверено 1 мая 2023 г.
- ^ Jump up to: Перейти обратно: а б с Рочкинд, Марк (2004). Расширенное программирование UNIX (2-е изд.). Аддисон-Уэсли. стр. 56–63. ISBN 978-0-13-141154-8 .
- ^ Саксена, Ашутош; Рават, Санджай. «Рабочий документ IDRBT № 9» (PDF) . Архивировано из оригинала (PDF) 13 мая 2012 года.
- ^ «FILETIME (minwinbase.h) — приложения Win32» . Microsoft Learn . Майкрософт. 2 апреля 2021 года. Архивировано из оригинала 10 марта 2023 года . Проверено 9 марта 2023 г.
- ^ «Время файлов — приложения Win32» . Microsoft Learn . Майкрософт. 7 января 2021 года. Архивировано из оригинала 8 марта 2023 года . Проверено 9 марта 2023 г.
- ^ «Как преобразовать атрибуты даты/времени в Active Directory в стандартный формат времени» . Microsoft Learn . Майкрософт. Архивировано из оригинала 20 октября 2022 года . Проверено 20 октября 2022 г.
- ^ В. Ричард Стивенс; Билл Феннер; Эндрю М. Рудофф (2004). Сетевое программирование UNIX . Аддисон-Уэсли Профессионал. стр. 582–. ISBN 978-0-13-141155-5 . Архивировано из оригинала 30 марта 2019 года . Проверено 16 октября 2016 г.
- ^ «datetime — Основные типы даты и времени» . Справочник по стандартной библиотеке Python . Фонд программного обеспечения Python. Архивировано из оригинала 19 октября 2022 года . Проверено 20 октября 2022 г.
Атрибуты: год, месяц, день, час, минута, секунда, микросекунда и цинфо.
- ^ Jump up to: Перейти обратно: а б Твини, Дилан (12 февраля 2009 г.). «Любители Unix веселятся, как будто это 1234567890» . Проводной . Архивировано из оригинала 29 марта 2014 года . Проверено 12 марта 2017 г.
- ^ «Slashdot | date +%s Turning 1111111111» . 17 марта 2005 г. Архивировано из оригинала 12 января 2020 г. Проверено 12 января 2020 г. [ ненадежный источник? ]
- ^ «Факты и мелочи о времени Unix - Unix Time. Информация» . Архивировано из оригинала 27 октября 2017 года.
- ^ «UNIX приближается к зрелой старости в один миллиард» . Электромагнетик.нет. Архивировано из оригинала 13 апреля 2013 года . Проверено 6 декабря 2012 г.
- ^ Нойманн, Питер Г. (15 октября 2001 г.). «Дайджест RISKS, том 21, выпуск 69» . Дайджест рисков . 21 (69). Архивировано из оригинала 22 октября 2015 года . Проверено 6 декабря 2012 г.
- ^ «Технические проблемы» . linuxmafia.com . Архивировано из оригинала 11 октября 2012 года . Проверено 21 августа 2017 г.
- ^ nixCraft. «Юмор: В пятницу, 13 февраля 2009 г., Unix-время будет 1234567890» . Cyberciti.biz . Проверено 5 июля 2023 г.
- ^ «Логотип Google 1234567890» . Google Inc. Архивировано из оригинала 11 января 2013 года . Проверено 28 января 2013 г.
- ^ Ахмед, Мурад (13 февраля 2009 г.). «При третьем такте время Unix будет 1234567890» . Таймс . Архивировано из оригинала 14 ноября 2016 года . Проверено 12 января 2020 г.
- ^ Маши, Джон Р. (27 декабря 2004 г.). «Языки, уровни, библиотеки и долголетие» . Очередь . 2 (9): 32–38. дои : 10.1145/1039511.1039532 . S2CID 28911378 .
Внешние ссылки
[ редактировать ]- Руководство программиста Unix, первое издание
- Личный отчет о решениях POSIX Лэндона Курта Нолла
- Хроно-совместимые низкоуровневые алгоритмы дат - алгоритмы преобразования между григорианскими и юлианскими датами и количеством дней с начала времени Unix.