2011-09-01 5 views
27

Использование javascript Я знаю, что часовой пояс моих пользователей - UTC +3.php: установка часового пояса по смещению UTC

Теперь я хочу, чтобы создать объект DateTime с этим знанием:

$usersNow = new DateTime('now', new DateTimeZone("+3")); 

я получаю как respsonse:

'Unknown or bad timezone (+2)' 

Что я делаю неправильно? Как я могу исправить?

ответ

35

как об этом ...

$original = new DateTime("now", new DateTimeZone('UTC')); 
$timezoneName = timezone_name_from_abbr("", 3*3600, false); 
$modified = $original->setTimezone(new DateTimezone($timezoneName)); 
+0

+3 это только пример. – shealtiel

+0

отредактирован для использования utf offset – minaz

+0

+1 просто чтобы сделать еще + 3 ^^ (просто шучу, ваш ответ правильный). –

1

Насколько я могу судить по документам на DateTimeZone, вам необходимо пройти действительный часовой пояс, и вот valid. Проверьте others, что-то там может вам помочь.

0

DateTimeZone требует часовой пояс не offest

+8

И как я могу установить часовой пояс, зная только смещение UTC? – shealtiel

+0

@shealtiel вы не можете –

1

вы попробуете это

http://php.net/manual/en/function.strtotime.php

<?php 
    echo strtotime("now"), "\n"; 
    echo strtotime("10 September 2000"), "\n"; 
    echo strtotime("+5 hours"); 
    echo strtotime("+1 day"), "\n"; 
    echo strtotime("+1 week"), "\n"; 
    echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n"; 
    echo strtotime("next Thursday"), "\n"; 
    echo strtotime("last Monday"), "\n"; 
    ?> 
+0

это может работать. Мне действительно не нужно имя timezones, просто чтобы вычислить правильное время. Таким образом, «+3 часа» будет делать трюк штраф – shealtiel

8

Вы сказали:

Использование javascript Я знаю, что часовой пояс моих пользователей - UTC +3.

Вы, наверное, пытался что-то вроде этого:

var offset = new Date().getTimezoneOffset(); 

Это возвращает текущий смещение от UTC в течение нескольких минут, с положительными значениями падения к западу от UTC. Это не вернуть часовой пояс!

Часовой пояс не является смещением. Часовой пояс имеет офсет. Он может иметь несколько различных смещений. Часто есть два смещения: один для стандартного времени и один для летнего времени. Одно числовое значение не может представлять это в одиночку.

  • Пример часового пояс: "America/New_York"
    • Соответствующие стандартное отклонение: UTC-5
    • Соответствующие дневное смещение: UTC-4

Кроме двух смещений, а также завернутый в том, что часовой пояс - это даты и время перехода между двумя смещениями, чтобы вы знали, когда они приходят LY. Существует также исторический отчет о том, как смещения и переходы могут со временем меняться.

См. Также «Часовой пояс! = Смещение» в the timezone tag wiki.

В вашем примере, вы, вероятно, получили значение -180 из javascript, представляющее текущий смещение UTC + 3. Но это только смещение для этого конкретного момента времени! Если вы следуете minaz's answer, вы получите часовой пояс, который делает предположение, что UTC + 3 всегда правильное смещение. Это будет работать, если в реальном времени есть что-то вроде "Africa/Nairobi", который никогда не использовал ничего, кроме UTC + 3. Но для всех, кого вы знаете, ваш пользователь может быть в "Europe/Istanbul", который использует UTC + 3 летом и UTC + 2 зимой.

+3

Этот ответ заслуживает большего внимания. Очень подробное объяснение проблемы @shealtiel. –

1

Для тех, кто сталкивается с этим, я столкнулся с такой же проблемой, поэтому в конце я расширил класс DateTime и переопределил метод __construct(), чтобы принять смещение (в минутах) вместо часового пояса.

Оттуда мой пользовательский номер __construct() определяет, что такое смещение в часах и минутах (например, -660 = +11: 00), а затем использует parent::__construct(), чтобы передать мне дату, выполненную с учетом моего смещения, обратно к оригиналу DateTime.

Потому что я всегда имеем дело с UTC время в моем приложении, мой класс также изменяет время UTC путем вычитания смещения, поэтому прохождение Полуночная UTC и смещение -660 покажет мне 11 утра

Мое решение подробно здесь: https://stackoverflow.com/a/35916440/2301484

0

Это один принимает ответ Мэтью шаг дальше тя nge часовой пояс даты для любого целочисленного смещения.

public static function applyHourOffset(DateTime $dateTime, int $hourOffset):DateTime 
{ 
    $dateWithTimezone = clone $dateTime; 

    $sign = $hourOffset < 0 ? '-' : '+'; 
    $timezone = new DateTimeZone($sign . abs($hourOffset)); 
    $dateWithTimezone->setTimezone($timezone); 

    return $dateWithTimezone; 
} 

Примечание: У меня был разрыв в производстве в связи с принятым ответом.

0

Мне было послано решение проблемы с помощью ссылки Joey Rivera. Как то, что говорили здесь другие, часовой пояс не является смещением, вам нужен действительный часовой пояс.

Это то, что я использую для себя

$singapore_time = new DateTime("now", new DateTimeZone('Asia/Singapore')); 


var_dump($singapore_time); 

Я сам нашел, что это будет гораздо удобнее работать с YYYY-MM-DD HH: MM формат. пример.

$original = new DateTime("2017-05-29 13:14", new DateTimeZone('Asia/Singapore')); 
Смежные вопросы