У меня есть 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.
Надеюсь, это поможет.