Что такое время Unix и когда наступила эпоха Unix?
Linux

Что такое время Unix и когда наступила эпоха Unix?

Время Unix – это система, используемая компьютерами для измерения времени. Но как работает время Unix? И что такое ‘эпоха Unix?’

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

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

Каково назначение времени Unix?

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

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

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

Об эпохе

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

$ date +%s
1612960114

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

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

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

$ 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, с помощью Linux-версии ls вы можете использовать следующее:

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

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

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

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

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

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

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

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

Такие понятия, как эпоха и временные метки, являются важной частью начала работы в Linux. Чтобы узнать больше об основных командах, таких как ls , ознакомьтесь с нашим руководством по основным командам Linux

Теги

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий