У меня есть PHP MySQL запрос, который вставляет некоторые данные в базу данных MySQL и включает в себя временную метку.
В настоящее время запрос INSERT использует NOW() для столбца timestamp и сохраняется в базе данных в следующем формате: 2012-07-24 13:13:02
К сожалению для меня сервер не находится в моем часовом поясе, и он указан как America / Los_Angeles, как показано print date_default_timezone_get();
Я надеялся сделать следующее:
date_default_timezone_set('Europe/London'); $timefordbLondonEU = date('Ymd H:i:s', time());
и просто сохраните в базе данных $timefordbLondonEU вместо NOW() ;
Это хороший способ сохранить такие данные?
Большое спасибо,
Ричард
[ДОБАВЛЕННЫЙ ТЕКСТ]
Я изменил тип в MySQL db на DateTime и сделал следующее:
date_default_timezone_set('Europe/London'); $timefordbLondonEU = date('Ymd H:i:s', time());
Он работает, но я до сих пор не получаю общую концепцию.
Assumptions based on your comments:
Моя догадка и результат из того, что вы сказали, это лучший способ сделать это, это сохранить время как UTC в INT (1343247227), а затем сгенерировать любые часовые пояса, которые вы хотите оттуда. Опять же, предполагая, что вам не нужно хранить даты до отметки 0 баллов в 1970 году.
В равной степени почему бы не хранить в качестве даты и времени YYYY-MM-DD HH: MM: SS в известном часовом поясе, а затем конвертировать в UTC или другие часовые пояса. Все это кажется довольно грязным = (
Как сказал @Petah в комментариях, сохраняйте свое время в UTC и скрывайте их в приложении по мере необходимости.
Временные метки Unix находятся в UTC, поэтому я обычно храню свое время в базе данных как временные метки. Это избавляет от головной боли и путаницы первого преобразования в UTC для вставки, а затем из UTC при выборе.
То есть сделайте свое поле времени типом INT и используйте функцию UNIX_TIMESTAMP() в MySQL при вставке или получите time() метку из PHP с помощью функции time() .
Когда вы date_default_timezone_set метку из БД, она будет в формате UTC, но когда вы покажете ее в своем приложении PHP с помощью date() , она будет отображаться в часовом поясе сервера или в любом date_default_timezone_set установленном с помощью date_default_timezone_set .
Поэтому будут работать следующие два запроса:
INSERT INTO `table` (id, time) VALUES(NULL, UNIX_TIMESTAMP()); // or $time = time(); $query = "INSERT INTO `table` (id, time) VALUES(NULL, $time);
Если вы хотите выбрать его из БД как DATETIME , вы можете сделать это:
SELECT *, FROM_UNIXTIME(time) as dt FROM `table` WHERE 1
Полученный столбец dt будет в формате yyyy-MM-dd hh:mm:ss .
Вы можете отформатировать числовую метку времени в PHP с помощью date()
Если у вас есть версия PHP, 64-разрядная, вы не ограничены диапазоном 1970 – 2036, PHP будет поддерживать 64-битные временные метки, просто убедитесь, что в этом случае нужно использовать столбец BIGINT в MySQL.
Надеюсь, это поможет.