Отображение текущего времени в часовом поясе пользователя, не забывая о летнем времени - PullRequest
2 голосов
/ 09 декабря 2011

Я знаю, что есть много похожих вопросов, но я не нашел то, что мне точно нужно ...

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

Пока я сделал следующее:

  1. В PHP я везде использую $ TIME, а именно:

    $TIME = time() - date("Z");

    Это должна быть абсолютная ссылка на время, без dst , я прав?

  2. Я получаю смещение часового пояса пользователя с помощью javascript (только во время первого посещения) и сохраняю его в минутах:

    var d = new Date(); var tz = -d.getTimezoneOffset();

    Конечно, пользователь может установить свой часовой пояс на другой.

  3. При отображении дат из базы данных я добавляю сохраненное количество времени к отметке времени: $timestamp += $TIMEZONE_OFFSET * 60;

    И я форматирую его с датой ()

Кажется, это работает хорошо, но мне интересно, что, если речь идет о dst.

Я думал об автоматическом изменении смещения часового пояса пользователя, когда дело доходит до dst, но тогда все даты будут изменены (те, которые не входят в период dst). И не все регионы используют dst, поэтому я действительно не понимаю, как это выяснить: \

Ответы [ 2 ]

0 голосов
/ 09 декабря 2011

Я бы отправил все метки времени в формате Unix date (), который основан на UTC, независимо от часовых поясов, DST и тому подобное. На стороне PHP:

$php_timestamp = gettimeofday(true);

На стороне JavaScript:

var js_timestamp = new Date(php_timestamp*1000);

Тогда все get{FullYear,Month,Date,Hours,...}() и to[Locale]{Date,Time,}String() методы будут автоматически давать результаты в зависимости от часового пояса пользователя (клиента).

0 голосов
/ 09 декабря 2011

Прежде всего, time() и date() зависит от настройки INI date.timezone, а также от летнего времени. Для абсолютного времени вы должны использовать gmmktime() и gmdate().

Информация о DST часового пояса может быть разрешена, например, с помощью DateTimeZone::getTransitions().

Или вместо этого вы можете использовать сторонние сервисы.

...