Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%
Unix время и Unix Timestamp (MySQL, PHP, JavaScript)
Здравствуйте, уважаемые читатели блога LifeExample, в данной статье, я хочу рассказать вам о том, что такое Unix время и Unix Timestamp. Часто программисты объединяют эти понятия в одно, но это не совсем верно. Кроме того, статья содержит много полезных заметок, на тему работы с Unix Timestamp в PHP , MySQL и JavaScript.
Почему Unix время начинается с 1 января 1970 года
Все дело в том, что Unix время начинает отсчет эпохи Unix, с выпуска первой UNIX системы. Первая система подобного рода была создана в 1969 году, поэтому точкой отсчета времени разработчики приняли дату с 1 января 1970 года в полночь по UTC (Всемирное координированное время).
Давайте разберемсяс тем, для чего нужны Unix время и Unix Timestamp, а также дадим им четкие понятия.
Unix время – это текущее количество секунд прошедших с 1 января 1970 года.
Unix Timestamp – это метка времени, которая представляет собой последовательность символов, отражающих количество секунд, прошедших с 1 января 1970 года.
Попробую привести пример, для разъяснения разницы этих двух понятий.
На время написания мной данного поста, Unix время было равно 1346765877.
На время прочтения, Вами, этой информации, запись о времени (1346765877) , уже является меткой — Unix Timestamp! Конвертировав данную метку времени в удобочитаемый вид, мы получим дату 04-09-2012 и время 17:37:57.
Откровенно говоря, особого смысла разделять два понятия, на мой взгляд, нет, но все же полезно иметь представление о том, что из-себя представляет Unix Time, а также полезно понимать, что количество максимально возможных секунд прошедших с 1970 года, имеет предел!
Конец эпохи Unix придёт в 2038 году
Факт: максимальным двоичным числом в 32 битных системах является число 01111111 11111111 11111111 11111111, переведя его в десятичную систему, мы получим число 2147483647.
19 января 2038 года в 03:14:08 настанет момент, когда количество секунд прошедших с начала эры Unix, превысит максимальное, доступное в 32 битной системе, число = 2147483647. При переполнении разряда, произойдет сброс даты.
Проверить эту теорию на наглядном примере очень просто:
- Откройте стандартный калькулятор Windows нажмите ALT+3, этим вы переведете его в инженерный вид;
- Установите 4 байтовый режим, и десятичный тип ввода;
- Напишите число 2147483647;
- Обратите внимание, на представление числа в двоичной системе;
- Прибавьте к числу единицу;
- Результатом сложения окажется отрицательное число!
Если продолжить добавлять единицу, то мы получим циклическое замыкание.
Именно такое кольцевание дат произойдет с 19 января 2038 года на всех системах использующих 32 битную архитектуру.
На самом деле не стоит печалиться, ведь разработчики вычислительных систем все больше внедряют 64 битные архитектуры в повсеместное использование. Будем верить в то, что они успеют к 2038 году.
Теперь поговорим об использовании unix timestamp в php, mysql и даже в javascript.
Работа с unix timestamp
Очень важным моментом, при работе с unix timestamp в php или mysql, является необходимость четкого понимать плюсы и минусы такого формата даты.
Например, TIMESTAMP не получится использовать для задания исторических событий или событий далекого будущего. Весь набор дат ограничен периодом с 1970 по начало 2038 года. Если задать дату, выходящую за рамки 2038, она будет не правильно интерпретирована 32 битной системой.
Осознав это ограничение, напрашивается логический вопрос: "Зачем нужно заморачиваться с представлением даты в секундах?"
Когда следует использовать Unix Timestamp
Для представления времени в обычной для нас системе его измерения, требуется 8 байт, а для unix timestamp вдвое меньше – 4 байта.
Экономия объема данных, на мой взгляд, основной и неоспоримый плюс в использовании Unix Time.
Кроме того есть ряд полезных нюансов доступных при работе с UNIX timestamp в mysql. А поскольку вся информация должна храниться на сервере баз данных, и он в свою очередь имеет ряд преимуществ, при работе с метками Unix времени, то выбор в сторону unix timestamp можно корректно обосновать следующими положениями.
В MySQL предусмотрен соответствующий тип данных Timestamp для работы с форматом unix-времени, установив который мы сразу получаем полезное преимущество, перед стандартными форматами DATE и DATETIME. Преимущество заключается в том, что выполняя операцию добавления новой записи в таблицу, столбец с этим типом данных заполняется автоматически. А это значит, что мы можем сэкономить не только на объеме данных, но и на процессорном времени веб сервера.
Для подкрепления слова делом поставим такую задачу: при регистрации нового пользователя в системе, нужно заносить дату его добавления в базу данных.
Если тип поля хранящего дату в таблице – DATETIME, то запрос из PHP скрипта будет выглядеть примерно так:
1 | $sql="INSERT INTO user SET name='$name', date='".date("Ymdhms"); |
В случае, когда поле date имеет тип TIMESTAMP запрос будет таким:
1 | $sql="INSERT INTO user SET name='$name'”; |
Выгода очевидна!
Есть и минус: если полей типа TIMESTAMP несколько, автоматом обновляется, только, первое.
Есть ли смысл использовать INT вместо timestamp
Многие программисты при работе с unix timestamp, используют целочисленный формат int(11). Это совершенно не рациональный подход к вопросу, поскольку в MySQL для типа timestamp предусмотрено множество полезных функций, влияющих на скорость работы с ним. Поэтому храня, метку времени в INT, мы лишим себя всяческой серверной поддержки этого формата. Это примерно, тоже, что хранить id в типе varchar(11) .
Тем не менее, есть одно оправдание хранения unix timestamp в INT. При переносе базы между разными СУБД, может возникнуть конфликт типов, т.е. для одной из СУБД тип timestamp может оказаться незнакомым. В этом случае использование int будет иметь преимущество, поскольку данный формат есть во всех СУБД.
Краткая характеристика календарных типов MySQL
TIMESTAMP — тип данных для хранения даты и времени. Данные хранятся в виде количества секунд, прошедших с начала «эпохи Юникса». Диапазон значений: 1970-01-01 00:00:00 — 2038-12-31 00:00:00. Занимает 4 байта.
DATE — тип данных для хранения даты. Диапазон значений: 1000-01-01 — 9999-12-31. Занимает 3 байта.
DATETIME — тип данных для хранения даты и времени. Диапазон значений: 1000-01-01 00:00:00 — 9999-12-31 00:00:00. Занимает 8 байт и хранится в виде числа YYYYMMDDHHMMSS./p>
YEAR — тип данных для хранения года. Диапазон значений: 1901 — 2155. Занимает 1 байт.
TIME — тип данных для хранения времени. Диапазон значений: −828:59:59 — 828:59:59. Занимает 3 байта.
Перевод даты в unix
Пришло время выложить несколько полезных функций по переводу даты в unix timestamp и обратно из unix-time в читабельную дату.
Как получить текущее UNIX-время
- PHP:
1time();
- JavaScript:
1Math.round(new Date().getTime()/1000.0);
- MySQL:
1SELECT unix_timestamp(now());
Как перевести дату в UNIX-время
- PHP:
1
2
3mktime (); // первый вариант
strtotime(date("Y-m-d")); // второй вариант
date( "Y-m-d H:i:s" , $timestamp); // третий вариант - JavaScript:
1Date.UTC(year, month-1, day, hour, min, sec) / 1000;
- MySQL:
1SELECT unix_timestamp(YYYY-MM-DD HH:MM:SS);
Данные заметки по работе с Unix Timestamp в MySQL, PHP и JavaScript
помогут вам при переводе даты в unix время, и конвертации unix timestamp в читаемый вид.,
Надеюсь, статья оказалась не только полезной, но и интересной. Подписывайтесь на обновления, в скором времени выйдет еще одна интересная статья.
Читайте также похожие статьи:
Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.
Комментарии
Имеете ввиду, что для DATE и DATETIME этот код:
не отработает?