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

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

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

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

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

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

Unix время (epoch)

Об эпохе

Итак, время 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

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

date +%s

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

date -d "Jan 2 1970" +%s

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

Двигаясь в другом направлении, вы можете конвертировать из временной метки Unix:

date -d @1600000000

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

ls -l --time-style=+%s .bash_history

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

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

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

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

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

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий