Что такое время Unix и когда была эта эпоха?

UNIXИстория

Время Unix — это система, которую компьютеры используют для измерения времени. Но как работает это время и что такое «эпоха Unix»?

Почему в Unix есть собственное понятие времени? Какая эпоха и в чем проблема Y2038?

Время Unix – это средство представления определенной даты и времени, используемое Linux, macOS и многими другими совместимыми системами. Он настолько распространен, что вы, вероятно, используете его, даже не подозревая об этом. Однако, как только вы поймете время Unix, вы заметите его во многих контекстах, а несколько предоставленных нами инструментов, могут помочь вам в работе со временем Unix.

Какова цель Unix Time?


Время Unix — это количество секунд, прошедших с фиксированной даты и времени. Это формат даты / времени (или отметки времени), который отличается от привычных нам удобочитаемых дат и времени. Это чисто из соображений эффективности. Для хранения одного числа, представляющего секунды, требуется намного меньше места, чем для хранения отдельных значений года, месяца, часа и т. д.

Конечно, говоря современным языком, разница в пространстве не так уж и велика. Но учтите, что Unix возник в конце 1960-х, когда доступное хранилище было намного меньше. Также часто используются временные метки, поэтому их хранилище увеличивается. Например, с каждым файлом связаны три метки времени.

Формат практически невозможно перевести в уме, если вы не гений математики. Но он по-прежнему имеет некоторые преимущества перед более читаемыми альтернативами, такими как среда, 21 октября 2015 г., 07:28:00 по Гринвичу. Вы можете легко и быстро заказать две метки времени Unix. Также обычно быстрее определить разницу между двумя отметками времени. Это особенно верно для дат, близких друг к другу, например, в соседние дни.

Об эпохе

Итак, время Unix — это общее количество секунд с определенного момента времени. Но что это за момент времени? Это 00:00:00 UTC на 1 января 1970 года. Это часто называют эпохой Unix. Программисты выбрали эту дату для эпохи из соображений удобства, поскольку это была ближайшая круглая дата, когда они изобрели время Unix.

Возможно, вы видели эту дату, когда что-то пошло не так. Это явно ошибка, но она выглядит очень странно, когда она приводит к дате до того времени, когда многие из нас родились! Впрочем, это вполне понятно, если знать о времени Unix. Если какая-либо система пытается отобразить метку времени, которая не имеет никакого значения, она часто преобразуется в 0 и приводит к точной дате эпохи.

Формат данных времени Unix


Собственно говоря, его нет. Исходный тип данных был 32-битным целым числом, и это часто остается так, даже в гораздо более мощных системах.

Этот тип данных позволяет значению хранить в общей сложности 2^32 (2 в 32-ой степени) секунды, что составляет чуть более 136 лет. Это значение обычно подписано, что означает, что оно может быть отрицательным или положительным. Таким образом, обычно это 68 лет по обе стороны от эпохи, то есть с 1902 по 2038 годы.

Статьи по теме


Конечно, это еще ограниченный период. Но в первую очередь формат временной метки использовался для таких понятий, как модификация файлов. Очень важно было представить время, близкое к настоящему, а не древнюю историю или далекое будущее. Даже для таких приложений, как календари, редко требуется представлять даты более чем на несколько десятилетий в будущем.

Но это не значит, что в этом ограниченном промежутке времени нет проблем…

Проблема 2038 года

Ошибка 2000 года, одна из худших ошибок программирования в истории, затронула компьютерные системы, которые хранят годы в виде двузначных значений. Когда наступил 2000 год, такие системы относились к нему так, как будто это был 1900 год. В действительности это было не так катастрофично, как предполагалось, главным образом потому, что многие люди заранее потратили много времени и усилий, готовясь к нему.

Если бы вы обратили внимание на предыдущий раздел, вы могли бы заметить аналогичную проблему, которая может повлиять на время Unix. Что ж, у Unix time есть собственная проблема с данными: проблема Y2k38. (Это часто называют проблемой, а не ошибкой; возможно, мы стали более оптимистичными с 2000 года!) Когда время Unix буквально истечет в 2038 году, системы будут рассматривать новые даты как 1902 или 1970.

По крайней мере, эта проблема нас не коснется ровно в полночь под Новый год. Последняя секунда 32-битного времени Unix приходится на 19 марта. В конечном итоге мы, скорее всего, модернизируем большинство систем к 2038 году, или к тому времени они все равно устареют.

Некоторые полезные ресурсы по меткам времени


Сайт Epoch Converter, возможно, является наиболее полным доступным конвертером временных меток. Он начинается с отображения текущего времени Unix — в реальном времени — и добавляет к этому почти все мыслимые функции. Его основное использование — для преобразования между отметками времени и датами, удобочитаемыми человеком, в обоих направлениях.

Dan’s Tools — это огромная коллекция полезных веб-приложений, одно из которых — конвертер временных меток, он более прост в использовании.

Time.is представляет еще один, еще более минималистичный вид. Он показывает время в нескольких форматах, включая время Unix. Он включает в себя текущее время в заголовке страницы, что полезно.

Использование Unix Time с инструментами командной строки


В Linux и macOS программа даты является основной утилитой для работы с датой и временем, включая временные метки Unix. Вызывается без каких-либо аргументов, возвращает текущую дату / время в удобочитаемом формате:

$ date
Wed Feb 10 12:28:30 GMT 2021

Если вам нужна текущая дата / время во времени Unix, используйте аргумент +% s :

$ date +%s
1612960114

Вы можете преобразовать дату, удобочитаемую человеком, в метку времени, используя флаг -d, если ваша версия даты поддерживает его. Большинство версий Linux по умолчанию должны:

$ date -d "Jan 2 1970" +%s
82800

В macOS дата — это другая программа, для которой требуется другой набор флагов:

$ date -j -f "%b %d %Y %T" "Jan 02 1970 00:00:00" "+%s"
82800

Идя в другом направлении, вы можете преобразовать временную метку Unix, используя флаг -r:

$ date -r 1600000000
Sun 13 Sep 2020 13:26:40 BST

Некоторые другие программы используют формат %s для работы со временем Unix. Например, если вы хотите показать дату изменения файла во времени Unix, с версией ls для Linux, вы можете использовать следующее:

$ ls -l --time-style=+%s index.tmp.html
-rw-r--r-- 1 ubuntu ubuntu 17862 1521649818 index.tmp.html

Как использовать Unix Time в языках программирования


В PHP есть функция time(), которая возвращает текущую временную метку Unix. Его функция date() принимает метку времени в качестве второго аргумента:

$ php -r 'echo date("Y-m-d", time());'
2021-02-11

JavaScript подходит к вещам интересным образом. У него есть метод Date.now() для получения количества миллисекунд с эпохи Unix. Конечно, вы можете разделить это на 1000 и округлить результат, чтобы получить эквивалентное время Unix в секундах:

> Math.floor(Date.now() / 1000)
1613083012

Понимание времени Unix


Такие понятия, как эпоха и временные метки, являются важной частью начала работы с Linux. Время Unix — это простая концепция, которая возникает во многих местах. Как только вы это поймете, вы можете найти его весьма полезным, например, при вычислении разницы во времени. Вы также можете распознать, когда это может быть причиной определенных ошибок.

Источник: MakeUseOf