Почему в Unix есть собственное понятие времени? Какая эпоха и в чем проблема Y2038?
Время Unix - это средство представления определенной даты и времени, используемое Linux, macOS и многими другими совместимыми системами. Он настолько распространен, что вы, вероятно, используете его, даже не подозревая об этом. Однако, как только вы поймете время Unix, вы заметите его во многих контекстах. Несколько инструментов могут помочь вам в работе со временем Unix.
Какова цель Unix Time?
Время Unix - это количество секунд, прошедших с фиксированной даты и времени. Это формат даты и времени (или отметки времени), который отличается от привычных нам удобочитаемых дат и времени. Это чисто из соображений эффективности. Для хранения одного числа, представляющего секунды, требуется гораздо меньше места, чем для хранения отдельных значений года, месяца, часа и т. Д.
Конечно, говоря современным языком, разница в пространстве не так уж и велика. Но учтите, что Unix возник в конце 1960-х годов, когда доступное хранилище было намного меньше. Также часто используются временные метки, поэтому их хранилище увеличивается. Например, с каждым файлом связаны три метки времени.
Формат практически невозможно перевести в уме, если вы не гений математики. Но у него все еще есть некоторые преимущества перед более читаемыми альтернативами, такими как Ср, 21 окт 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 года
Ошибка 2000 года (одна из худших ошибок программирования в истории) затронули компьютерные системы, которые хранят годы в виде двузначных значений. Когда наступил 2000 год, такие системы относились к нему как к 1900 году. В конце концов, это было не так катастрофично, как предполагалось, в основном потому, что многие люди заранее потратили много времени и усилий, готовясь к этому.
В своем легендарном прошлом кодирование также привело к разрушению. Экземпляры небольшого количества плохого кода вызывали катастрофу на серьезном уровне. Ниже приведены 10 худших ошибок программирования в истории.
Если бы вы обратили внимание на предыдущий раздел, возможно, вы заметили аналогичную проблему, которая может повлиять на время Unix. Что ж, у Unix time есть собственная проблема с данными: проблема Y2k38. (Это часто называют проблемой, а не ошибкой; может быть, с 2000 года мы стали более оптимистичными!) Когда время Unix буквально истечет в 2038 году, системы будут рассматривать новые даты как 1902 или 1970. Или, возможно, они просто потерпят неудачу.
По крайней мере, эта проблема нас не коснется ровно в полночь в канун Нового года. Последняя секунда 32-битного времени Unix приходится на 19 марта. В конце концов, мы, скорее всего, модернизируем большинство систем к 2038 году, иначе к тому времени они все равно устареют.
Некоторые полезные ресурсы по меткам времени
В Конвертер эпохи site, возможно, является наиболее полным доступным конвертером временных меток. Он начинается с отображения текущего времени Unix - в реальном времени - и добавляет к этому почти все мыслимые функции. Его основное использование - для преобразования между отметками времени и датами, удобочитаемыми человеком, в обоих направлениях.
Dan’s Tools - это огромная коллекция полезных веб-приложений, одно из которых конвертер временных меток. Он более простой, но имеет очень четкое представление и прост в использовании.
Время - это представляет другой, еще более минималистичный вид. Он показывает время в нескольких форматах, включая время Unix. Он включает в себя текущее время в заголовке страницы, что полезно.
В Linux и macOS Дата Программа - это основная утилита для работы с датой / временем, включая временные метки Unix. Вызывается без каких-либо аргументов, возвращает текущую дату / время в удобочитаемом формате:
$ дата
Ср 10 фев 12:28:30 GMT 2021
Если вам нужна текущая дата / время во времени Unix, используйте +% s аргумент:
$ date +% s
1612960114
Вы можете преобразовать дату, удобочитаемую человеком, в метку времени, используя -d отметьте, если ваша версия Дата поддерживает это. Большинство версий Linux по умолчанию должны:
$ date -d "2 января 1970 г." +% s
82800
В macOS Дата это другая программа, требующая другого набора флагов:
$ date -j -f "% b% d% Y% T" "02 января 1970 00:00:00" "+% s"
82800
Идя в другом направлении, вы можете конвертировать из метки времени Unix, используя -р флаг:
$ date -r 1600000000
Вс 13 сен 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 Time на языках программирования
PHP имеет время() функция, которая возвращает текущую временную метку Unix. Его Дата() функция принимает метку времени в качестве второго аргумента:
$ 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.
Хотите познакомиться с Linux? Начните с этих основных команд Linux, чтобы изучить стандартные вычислительные задачи.
- Неопределенные
Бобби - энтузиаст технологий, проработавший разработчиком программного обеспечения большую часть двух десятилетий. Он увлечен играми, работает редактором обзоров в Switch Player Magazine и занимается всеми аспектами онлайн-публикации и веб-разработки.
Подписывайтесь на нашу новостную рассылку
Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!
Еще один шаг…!
Пожалуйста, подтвердите свой адрес электронной почты в электронном письме, которое мы вам только что отправили.