Порой нам необходимо переводить время из одного формата в другой. Например, нужно время из PHP-скрипта сохранить в базе данных MySQL. Всё бы ничего… но они по-разному работают со временем. И новички порой строят огромные костыли, чтобы, как им кажется, упростить свою жизнь.
Для этой статьи я возьму в пример метки времени PHP и формат времени MySQL.
PHP работает с метками времени UNIX. То есть время представляется в виде количества секунд, прошедших с начала дня 1 января 1970 года. И на момент написания статьи — 23:25 17 июня 2015 года — PHP показал вот такое время — 1434573224. А вот в MySQL время хранится в другом формате (типе данных). Я предпочитаю тип DATETIME. Упомянутая выше дата выглядела бы в таблице MySQL в поле с типом DATETIME так: 2015-06-17 23:25:00.
Ну так как же нам перевести время из PHP-скрипта в MySQL? Очень просто. Для начала, давайте решим, откуда в вашем скрипте берется какая-либо метка времени? Допустим, время регистрации пользователя является временем работы скрипта. В этом случае нам достаточно использовать встроенную в PHP функцию time(). Она и вернет текущую метку времени UNIX. А если вам нужно сохранить в базе данных дату, которую пользователь ввел в HTML-форму? Тут задача немного сложнее. Но она сама по себе несложная.
<?php /** * Допустим, пользователь ввел в форму дату 23.06.2015 * С помощью регулярных выражений мы извлечем из этой строки и день, и месяц и год * Затем с помощью функции mktime(), встроенной в php, мы получим метку времени на указанную дату */ $sUserDate = "23.06.2015"; $pattern = '/^(\d{2})\.(\d{2})\.(\d{4})$/'; $result = preg_match( $pattern, $sUserDate, $matches ); if ( $result && !empty( $matches ) ) { $day = $matches[1]; $month = $matches[2]; $year = $matches[3]; } $time = mktime( 0, 0, 0, $month, $day, $year ); // Получим метку времени 1435006800 ?>
И как теперь сохранить это в базу? Да еще и в формате типа данных MySQL DATETIME… Легко!
<?php $time = 1435006800; $sql = "INSERT INTO `table` ( `reg_date` ) VALUES ( FROM_UNIXTIME( " . $time . " ) )"; /** * Обращаю внимание, в вашей таблице `table` у поля `reg_date` тип данных * должен быть DATETIME, DATE или TIMESTAMP * * Для сохранения времени в базе данных мы используем функцию MySQL FROM_UNIXTIME() * Она в качестве аргумента принимает метку времени UNIX, и преобразует его */ $query = mysql_query( $sql ) or die( mysql_error() ); ?>
Нувотивсёбырь Задача решена! Проверьте :)
…могло бы оказаться сложнее, но нет. Это так же просто. Нет, пожалуй, это еще проще.
<?php /** * Для того, чтобы получить с сервера время, представленное * в виде метки времени UNIX, мы используем встроенную в MySQL * функцию UNIX_TIMESTAMP() * * В качестве аргумента она примет значение, которое хранится * в вашей таблице в любом из типов данных даты и времени * * Более того, ей можно передать в качестве аргумента другую функцию * Я передам ей функцию NOW(), которая вернет текущую метку времени */ $sql = "SELECT UNIX_TIMESTAMP( NOW() )"; $query = mysql_query( $sql ) or die( mysql_error() ); ?>
Скажу вам больше. Если функции UNIX_TIMESTAMP() не передавать вообще никаких аргументов, результат будет тем же. Вам вернется текущая метка времени UNIX. И делайте с ним в своем скрипте теперь то, что хотите.
Наслаждайтесь! :)
Перевод времени из PHP в MySQL и из MySQL в PHP оказался делом плёвым. Вообще ерундовым. Я надеюсь, подключаться к своему СУБД вы уже умеете?
Подобные приемы очень часто нужны при написании алгоритмов регистрации и авторизации пользователей, а также просто при работе пользователя с HTML-формами, в которых он вводит дату и еще работает с динамическими списками select.