PHP: хранить ли дату как дату :)
Казалось бы, самый естественный путь для работы с датой и временем на PHP/MySQL - сохранять в базе данных MySQL
значение типа "дата и время" - для этого есть тип столбца datetime
:
CREATE DATABASE IF NOT EXISTS datetime; USE datetime; DROP TABLE IF EXISTS datetime; CREATE TABLE datetime ( date datetime ); INSERT INTO datetime (date) VALUES ( '2011-06-02 18:00:00' ); INSERT INTO datetime (date) VALUES ( '2011-05-03 17:00:00' );
По умолчанию даты хранятся в MySQL в формате год-месяц-день, за это отвечают установки
date_format %Y-%m-%d datetime_format %Y-%m-%d %H:%i:%s
В типовой ситуации мы хотим выбрать некие записи и вывести их по убыванию (реже возрастанию) даты:
<?php $d=mysql_connect('localhost', 'root', 'root') or die ("Соединение не установлено!"); mysql_select_db('datetime',$d); $r=mysql_query('select * from datetime order by date desc') or die ("Ошибка запроса!"); while ($date = mysql_fetch_array($r)) { echo '<p>'.$date['date'].'</p>'; } ?>
Здесь напечатается:
2011-06-02 18:00:00 2011-05-03 17:00:00
То есть, всё верно, но отображение даты неудобно. Можно его преобразовывать функциями PHP date
и
strtotime
перед выводом:
<?php $d=mysql_connect('localhost', 'root', 'root') or die ("Соединение не установлено!"); mysql_select_db('datetime',$d); $r=mysql_query('select * from datetime order by date desc') or die ("Ошибка запроса!"); while ($date = mysql_fetch_array($r)) { echo '<p>'.date("d.m.Y, H:i",strtotime($date['date'])).'</p>'; } ?>
Получилось вот что:
02.06.2011, 18:00 03.05.2011, 17:00
- формат даты/времени привычный и сортировка правильная.
Ещё один путь - использовать встроенную прямо в MySQL функцию date_format
:
<?php $d=mysql_connect('localhost', 'root', 'root') or die ("Соединение не установлено!"); mysql_select_db('datetime',$d); $r=mysql_query('select *,date_format(date,"%Y.%m.%d, %H:%i") as date1 from datetime order by date1 desc') or die ("Ошибка запроса!"); while ($date = mysql_fetch_array($r)) { echo '<p>'.$date['date1'].'</p>'; } ?>
Этот тест вывел
2011-06-02 18:00:00 2011-05-03 17:00:00
то есть, опять мы получили "день-месяц-год", а замена формата на
date_format(date,"%d.%m.%Y, %H:%i")
, очевидно, приведёт к неправильной сортировке -
3 мая окажется позже (выше в списке), чем 2 июня!
Чтобы не решать все эти проблемы с форматами, я просто всегда храню дату как длинное целое:
02.06.2011, 22:31 [12570 просмотров]