Поиск по сайту:

Что такое время Unix и когда была эпоха 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 секунды, что составляет чуть более 136 лет. Это значение обычно имеет знак, что означает, что оно может быть отрицательным или положительным. Таким образом, он обычно представляет 68 лет по обе стороны от эпохи, то есть 1902-2038 гг.

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

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

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

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

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

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

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

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

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

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

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

В Linux и macOS программа date является основной утилитой для работы с датой/временем, включая временные метки 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 — это другая программа, для которой требуется другой набор флагов:

$ 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 в языках программирования

В 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

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

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

Статьи по данной тематике: