Отображение часовых поясов без использования UTC - PullRequest
5 голосов
/ 13 октября 2009

Я читал о том, как это сделать все утро, и общее мнение таково: сохраняйте свои временные метки в UTC и вычисляйте смещение оттуда.

Однако, как и большинство людей, я поддерживаю существующую кодовую базу и не могу изменить способ хранения наших дат. По крайней мере, не в отведенное время.

Итак, мой вопрос, могу ли я безопасно сделать что-то подобное?

// this is my time zone
$timestamp = strtotime($timestampFromDatabase);
date_default_timezone_set('America/New York');
$tz = date_default_timezone_get();

// this is theoretically their timezone, which will eventually
// be taken from a session variable
date_default_timezone_set('Europe/Paris');
$offset = time() - $timestamp;
$timestamp -= $offset;

// now that I have the offset, display dates like this
date('r', $timestamp);

Некоторые люди советуют не делать арифметику дат, но что я делаю здесь неправильно? Есть ли способ лучше? Есть ли подводные камни, на которые мне нужно обратить внимание? Меня особенно интересуют, какие ошибки может вызывать этот метод, и, если таковые имеются, на кого они будут влиять?

Мой начальник - тот парень, которому все равно, если ошибка затрагивает только 1% пользователей.

Редактировать: Могу ли я сделать это более понятным? Похоже, у меня не так уж много желающих. Кто-нибудь? Даже смутное предложение или ссылка были бы чрезвычайно полезны.

1 Ответ

5 голосов
/ 14 октября 2009

Короткий ответ: с часовыми поясами работать сложно, и никто не хочет решать сложные вопросы!

Чем дольше, ответ таков:

Во-первых, вам нужно создать представление вашей даты в их текущих часовых поясах. Следующее эквивалентно:

date_default_timezone_set('America/New York');

$date = new DateTime(null);

OR

$date = new DateTime(null, new DateTimeZone('America/New York'));   

Это дает вам дату с зоной, установленной в Америке / Нью-Йорке. Мы можем легко преобразовать его в часовой пояс пользователя, в данном случае Европа / Париж, с помощью следующей строки:

$date->setTimezone(new DateTimeZone('Europe/London'));

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

echo $date->format('d/m/Y H:i:s');

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


Мой тестовый скрипт полностью:

date_default_timezone_set('America/Belize');

$date = new DateTime(null);

echo $date->format('d/m/Y H:i:s') . '<br>';

$date->setTimezone(new DateTimeZone('Europe/London'));

echo $date->format('d/m/Y H:i:s') . '<br>';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...