Pull to refresh

Comments 8

Ну поскольку упор на MySQL, то вставлю свои 5 копеек.
Хранить и timestamp и использовать:

use DateTime;

my $t = time(); // immitate timestamp column from DB
my $date1 = DateTime->from_epoch( epoch => $t, time_zone => 'Europe/Kiev');
my $date2 = DateTime->from_epoch( epoch => $t, time_zone => 'Europe/Moscow');
my $date3 = DateTime->from_epoch( epoch => $t, time_zone => 'Europe/Berlin');

print join("\n", $date1->hms(), $date2->hms(), $date3->hms());

и получим
18:33:14
19:33:14
17:33:14
Вы что делаете?
date_default_timezone_set('Europe/Moscow');
все!
А я храню дату и время в unsigned int (unix timestamp), это плохо?
Дык MySQL тип timestamp делает тоже самое, в статье поднимается вопрос, как потом оперировать часовыми поясами.
Относительно тематики поста — это даже лучше, так как не нужно писать в запросе функцию UNIX_TIMESTAMP() для получения сохраненного значения даты.
И больше вероятность, что новый программист, который будет завтра помогать тебе с проектом, задаст вопрос: «Почему в int и как с этим работать?» прежде чем преобразовывать дату в читабельный формат средствами mysql.
И 2038 год не страшен).

Но я все же считаю это плохим тоном.
К примеру: мы пишем умный редактор таблиц (phpMyAdmin) — и нужно предложить пользователю ввести значение в поле даты. Мы проверяем: если поле типа TIMESTAMP — выдаем ему календарик, иначе — поле для ввода числа.
тут этот вопрос уже обсуждался
ТУТ этот вопрос уже обсуждался: habrahabr.ru/blogs/mysql/61391/#comment_1682725
По-этому лучшее решение, если вы используете PHP я вижу в следующем:
1. Хранить дату в mysql в TIMESTAMP
2. Всегда в PHP задавать временную зону пользователя функцией
date_default_timezone_set()
3. Доставать значение TIMESTAMP из БД и переводить его в нужный формат в PHP функцией
date($format, $timestamp);

Единственный недостаток, как по мне, в таком случае если нада сделать группировку по дате. Если не задать таймзону в mysql и именно не в формате "+02:00", а 'Europe/Kiev', то и группировка пойдет в UTC и соответственно некоторые пункты попадут не в те дни. И уже на стороне пхп с этим ничего не сделаешь. Как вариант, может именно для таких выборок задавать таймзону для mysql «SET time_zone = 'EST'; Select… GROUP BY `created_at`»
Прошу извинения за вопрос не совсем по теме: какой командой в PHPmyAdmin (на удаленном сервере) можно преобразовать множество дат типа «UNIX время» (из одного столбца) в дату типа «datetime» стандартного формата YYYY-MM-DD HH:MM:SS ?
Only those users with full accounts are able to leave comments. Log in, please.