временная метка php utc
У меня есть запрос PHP MySQL, который вставляет некоторые данные в базу данных MySQL и включает метку времени.
В настоящее время запрос INSERT
использует NOW()
для столбца метки времени, и он сохраняется в базе данных в следующем формате: 2012-07-24 13:13:02
К сожалению для меня Сервер находится не в моем часовом поясе, и он указан как America/Los_Angeles, как показано на рисунке print date_default_timezone_get();
Я надеялся сделать следующее:
date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time());
И просто сохраните в базе данных $timefordbLondonEU
в место проведения NOW()
;
Является ли это хорошим способом сохранения таких данных?
Большое спасибо,
Ричард
[ ДОБАВЛЕННЫЙ ТЕКСТ]
Я изменил тип в БД MySQL на DateTime
и сделал следующее:
date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time());
Это работает, но я все еще не понимаю общей концепции.
Assumptions based on your comments:
- MySQL = Не имеет типа данных UTC, вы просто используете тип INT.
- unix_timestamp() сохранит текущее время или количество? в формате UTC, таком как 1343247227.
- Поскольку UTC - это отсчет от общей точки 0, вы можете получить из него любой часовой пояс. Предполагая, что вам не нужна дата до контрольной точки 0 в 1970 году.
Мое предположение и вывод из того, что вы сказали, лучший способ сделать это - сохранить время в формате UTC в INT (1343247227), а затем сгенерировать оттуда любые часовые пояса, которые вы хотите. Опять же, предполагая, что вам не нужно хранить даты до контрольной точки 0 в 1970 году.
В равной степени, почему бы не сохранить как дату и время ГГГГ-ММ-ДД ЧЧ:ММ:СС в известном часовом поясе, а затем преобразовать в UTC или другие часовые пояса. Все это кажется довольно запутанным =(
1 answers
Как сказал @Petah в комментариях, сохраняйте свое время в UTC и скрывайте его в приложении по мере необходимости.
Временные метки Unix указаны в UTC, поэтому я обычно сохраняю свое время в базе данных в виде временных меток. Это избавляет от головной боли и путаницы при первом преобразовании в UTC для вставки, а затем из UTC при выборе.
То есть сделайте свое поле времени типом INT
и используйте функцию UNIX_TIMESTAMP()
в MySQL при вставке или получите метку времени из PHP с помощью time()
функция.
Когда вы извлекаете метку времени из БД, она будет в UTC, но когда вы отобразите ее в своем PHP-приложении с помощью date()
, она будет отображаться в часовом поясе сервера или в любом другом, который вы установили 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()
Если у вас 64-разрядная версия PHP, вы не ограничены диапазоном 1970-2036 годов, PHP будет поддерживать 64-разрядные временные метки, просто убедитесь, что в этом случае в MySQL используется столбец BIGINT
.
Надеюсь, это поможет.