PHP: Как преобразовать временную метку сервера в часовой пояс пользователя?

В настоящее время я сохраняю время, используя функцию time() в базе данных. Однако он использует часовой пояс сервера, и я хотел бы, чтобы каждый пользователь видел время в соответствии со своим часовым поясом (установленным в их профиле).

Как сделать преобразование метки времени? (и я имею в виду от метки времени к метке времени, а не к читаемому времени)


person KeyStroke    schedule 14.05.2010    source источник


Ответы (3)


Как сказал Йоонас, временные метки UNIX по определению являются UTC, но вы можете взломать что-то подобное вместе, чтобы имитировать временные метки, зависящие от часового пояса, если вам действительно нужно:

// PHP 5.3 - OO Code
$timestamp = time();
echo 'Unix timestamp: ' . $timestamp;
$dt = DateTime::createFromFormat('U', $timestamp);
$dt->setTimeZone(new DateTimeZone('America/New_York'));
$adjusted_timestamp = $dt->format('U') + $dt->getOffset();
echo ' Timestamp adjusted for America/New_York: ' . $adjusted_timestamp;

// PHP 5.3 - Procedural Code
$timestamp = time();
echo 'Unix timestamp: ' . $timestamp;
$dt = date_create_from_format('U', $timestamp);
date_timezone_set($dt, new DateTimeZone('America/New_York'));
$adjusted_timestamp = date_format($dt, 'U') + date_offset_get($dt);
echo ' Timestamp adjusted for America/New_York: ' . $adjusted_timestamp;
person Mike    schedule 14.05.2010
comment
Спасибо, но я получаю эту ошибку "Вызов неопределенного метода DateTime::createfromformat()". Почему он говорит, что он не определен? - person KeyStroke; 14.05.2010
comment
Какую версию PHP вы используете? - person Mike; 14.05.2010

На самом деле вам не следует взламывать сами временные метки, чтобы изменить дату внутри, вы должны просто применить часовой пояс к временной метке, прежде чем предоставлять отформатированную метку даты пользователю.

Это модифицированная версия кода Майка, которая должна работать для PHP 5 >= 5.2.0, как указано на php.net

// OO Code
$st = 1170288000 //  a timestamp 
$dt = new DateTime("@$st"); 
$dt->setTimeZone(new DateTimeZone('America/New_York'));
$adjusted_timestamp = $dt->format('U') + $dt->getOffset();
echo ' Timestamp adjusted for America/New_York: ' . $adjusted_timestamp;

// Procedural Code
$st = 1170288000 //  a timestamp 
$dt = date_create("@$st"); 
date_timezone_set($dt, timezone_open('America/New_York'));
$adjusted_timestamp = date_format($dt, 'U') + date_offset_get($dt);
echo ' Timestamp adjusted for America/New_York: ' . $adjusted_timestamp;
person russholio    schedule 05.06.2012

Временные метки UNIX по определению указаны в формате UTC, а это означает, что все преобразования должны выполняться непосредственно перед распечаткой, а не с фактическими временными метками.

Однако, как это сделать, зависит от того, как вы их форматируете в данный момент. Я считаю, что PHP имеет встроенную обработку часового пояса.

person Joonas Trussmann    schedule 14.05.2010
comment
Я нашел несколько функций, но ни одна из них не преобразует метку времени в другой часовой пояс. Я выполняю много операций с отметкой времени из базы данных, поэтому указывать часовой пояс снова и снова в каждом экземпляре, в котором я вывожу время, — это немного переутомление. - person KeyStroke; 14.05.2010