DateTime (часовые пояса) в веб-приложениях PHP

Я узнал, что я должен хранить UTC и показывать по местному времени. Как я могу запросить в базе данных SQL строки, которые должны быть выполнены сегодня, в соответствии со временем пользователя. У меня есть таблица Todo со столбцом dueOn, который содержит временную метку UTC Unix в int.

Я думаю, это будет выглядеть примерно так

SELECT * FROM Todos 
WHERE dueOn BETWEEN {today's timestamp} AND {tomorrow's timestamp}

Что я буду использовать, чтобы получить отметку времени сегодня и завтра? Я думаю, это звучит просто, но я очень запутался со всеми подобными методами для даты и времени.

ОБНОВЛЕНИЕ

Мне интересно, что-то вроде ниже правильно

// set default timezone to the user's timezone
date_default_timezone_set("Asia/Singapore"); 
// get UTC datetime for today & tomorrow
$today = DateTime::createFromFormat('Y-m-d', date('Y-m-d'), new DateTimeZone('UTC')); 
$tomorrow =  clone($today);
$tomorrow->add(DateInterval::createFromDateString('1 day'));

$sql = 'SELECT * FROM Todos WHERE dueOn BETWEEN ' . $today->getTimestamp() . ' AND ' . $tomorrow->getTimestamp();
echo $sql;

Можно ли как-то получить время пользователя без использования date_default_timezone_set? Или все будет в порядке, поскольку это просто установит часовой пояс для запроса?


person Jiew Meng    schedule 21.01.2011    source источник


Ответы (1)


В вашем SQL-запросе используйте CONVERT_TZ, чтобы преобразовать дату выполнения из времени пользователя в UTC.

Ex:

SELECT * FROM Todos
WHERE CONVERT_TZ('2011-01-21', 'EST', 'UTC') BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 1 DAY)
person Dan Grossman    schedule 21.01.2011
comment
предположим, я хочу получить текущую метку времени в соответствии с часовым поясом пользователя, как мне это сделать вместо жестко заданного значения? В PHP и MySQL, если это возможно, я буду использовать Doctrine, поэтому я не буду использовать MySQL напрямую, но я тоже хотел бы научиться - person Jiew Meng; 21.01.2011
comment
В SQL, если часовой пояс пользователя EST, CONVERT_TZ(NOW(), 'EST', 'UTC'). В PHP date_default_timezone_set('EST') затем используйте date() или любую другую функцию даты и времени. - person Dan Grossman; 22.01.2011