временная метка 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:
  1. MySQL = Не имеет типа данных UTC, вы просто используете тип INT.
  2. unix_timestamp() сохранит текущее время или количество? в формате UTC, таком как 1343247227.
  3. Поскольку UTC - это отсчет от общей точки 0, вы можете получить из него любой часовой пояс. Предполагая, что вам не нужна дата до контрольной точки 0 в 1970 году.

Мое предположение и вывод из того, что вы сказали, лучший способ сделать это - сохранить время в формате UTC в INT (1343247227), а затем сгенерировать оттуда любые часовые пояса, которые вы хотите. Опять же, предполагая, что вам не нужно хранить даты до контрольной точки 0 в 1970 году.

В равной степени, почему бы не сохранить как дату и время ГГГГ-ММ-ДД ЧЧ:ММ:СС в известном часовом поясе, а затем преобразовать в UTC или другие часовые пояса. Все это кажется довольно запутанным =(

Author: DevilCode, 2012-07-26

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.

Надеюсь, это поможет.

 7
Author: drew010, 2012-07-25 22:45:55