PHP: Как мне преобразовать метку времени сервера в часовой пояс пользователя? - PullRequest
2 голосов
/ 14 мая 2010

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

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

Ответы [ 3 ]

9 голосов
/ 14 мая 2010

Как сказал Джунас, временные метки 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;
2 голосов
/ 05 июня 2012

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

Это модифицированная версия кода Майка, которая должна работать для 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;
1 голос
/ 14 мая 2010

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

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

...