Изменение текущего пользовательского часового пояса на основе смещения сервера UTC и пользователя UTC offset

#php #timezone #utc #datetimeoffset

#php #Часовой пояс #utc #datetimeoffset

Вопрос:

я пишу веб-сервис Twitter на php. Когда пользователь входит в систему, я получаю этот узел:

 <utc_offset>-18000</utc_offset>
  

Я должен изменить часовой пояс скрипта, чтобы он адаптировался к реальному часовому поясу пользователя. Единственная функция php, которую я нашел для этого, — это: date_default_timezone_set($timezone_identifier) но она не позволяет мне использовать -18000 в качестве параметра $timezone_identifier .

Итак, как я могу изменить текущий пользовательский часовой пояс на основе двух значений: смещение сервера UTC и смещение пользователя UTC

Кстати, вот как я получаю значение смещения сервера UTC:

 $this_tz_str = date_default_timezone_get();
$this_tz = new DateTimeZone($this_tz_str);
$now = new DateTime("now", $this_tz);
$offset = $this_tz->getOffset($now);
  

Есть идеи? Спасибо!

Комментарии:

1. -18000 — это смещение, а не идентификатор часового пояса. Для получения действительных идентификаторов часового пояса перейдите по этой ссылке .

2. я буду использовать ваш $ usertime вместо time () для вычисления дат 🙂

Ответ №1:

Чтобы получить текущее серверное время

 date_default_timezone_set(date_default_timezone_get());
echo date('Y-m-d H:i:s', time());
  

Вывод для Европы / Парижа (настройки моего сервера; UTC 2)

 2011-04-12 20:39:43
  

Чтобы получить время пользователя по смещению

 $user_offset = '-18000';
date_default_timezone_set('UTC');
$diff = "$user_offset seconds";
if ((substr($diff,0,1) != ' ') amp;amp; (substr($diff,0,1) != '-')) $diff = ' ' . $diff;
$usertime = strtotime($diff, time());
echo date('Y-m-d H:i:s', $usertime);
  

Вывод UTC-5 (время в Эквадоре -> Кито БЕЗ DST), идентификатор часового пояса php 'America/Guayaquil' .

 2011-04-12 13:39:43
  

PHP.net руководство:

Смещение часового пояса в секундах. Смещение для часовых поясов к западу от UTC всегда отрицательное, а для часовых поясов к востоку от UTC всегда положительное. (с-43200 по 50400)

Комментарии:

1. спасибо за код, отлично сработал! приятная деталь в выяснении, где был мой часовой пояс, хехе.

Ответ №2:

date_default_timezone... Функции ожидают строку, дающую что-то вроде «Африка / Луанда» или что-то еще.

Я предлагаю программный поиск соответствующего смещения в базе данных часовых поясов. Если я правильно помню, это в минутах от UTC, поэтому вы должны разделить указанное вам смещение на 60.

Комментарии:

1. смещение задается в секундах… если разделить 18000 на 60, получится разница в 300 часов… просто невозможно UTC-300 🙂

2. 18000 будет составлять 300 минут или 5 часов.

3. Да, поэтому вы должны разделить смещение на 3600, чтобы получить разницу UTC в часах UTC-5, верно?