Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< Code style (php, html5, js, css) || Автопостинг в твитер через Twitter API >>>

Unix время и Unix Timestamp (MySQL, PHP, JavaScript)

06.09.2012
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;
Пример Unix времени и Unix Timestamp - калькулятор
  • Обратите внимание, на представление числа в двоичной системе;
  • Прибавьте к числу единицу;
Замыкание unix времени
  • Результатом сложения окажется отрицательное число!

Если продолжить добавлять единицу, то мы получим циклическое замыкание.

Именно такое кольцевание дат произойдет с 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:
    1
    time();
  • JavaScript:
    1
    Math.round(new Date().getTime()/1000.0);
  • MySQL:
    1
    SELECT unix_timestamp(now());

Как перевести дату в UNIX-время

  • PHP:
    1
    2
    3
    mktime (); // первый вариант
    strtotime(date("Y-m-d")); // второй вариант
    date( "Y-m-d H:i:s" , $timestamp); // третий вариант
  • JavaScript:
    1
    Date.UTC(year, month-1, day, hour, min, sec) / 1000;
  • MySQL:
    1
    SELECT unix_timestamp(YYYY-MM-DD HH:MM:SS);

Данные заметки по работе с Unix Timestamp в MySQL, PHP и JavaScript
помогут вам при переводе даты в unix время, и конвертации unix timestamp в читаемый вид.,

Надеюсь, статья оказалась не только полезной, но и интересной. Подписывайтесь на обновления, в скором времени выйдет еще одна интересная статья.

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • Nick
    1
    $sql="INSERT INTO user SET name='$name', date='".date("Ymdhms");

    Имеете ввиду, что для DATE и DATETIME этот код:

    1
    $sql="INSERT INTO user SET name='$name', date = NOW();

    не отработает?

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

    Подписаться на комментарии к этой статье по RSS

    Яндекс.Метрика