2014-09-19 2 views
3

Вот сценарий - у меня есть часовой пояс по умолчанию в PHP, установленный в UTC. Все, кроме одной даты/времени, с которыми я работаю, устанавливаются в текущее время UTC; когда он отображается позже, я устанавливаю часовой пояс для этого конкретного пользователя, и дата появляется в их часовом поясе. Прекрасно работает.Изменение временной зоны без изменения значения объекта DateTime

Кроме того, у меня есть одна дата/время, которое пользователь может ввести в форму. Он появляется в виде «ГГГГ-ММ-ДД ЧЧ: ММ» в течение 24 часов (пример: «2014-09-18 17:00»). Пользователь, естественно, устанавливает это время в своем часовом поясе, а не в UTC.

Если я создаю новый объект DateTime с входным значением, он сохраняет в формате UTC, поэтому при отображении позже он отключается на несколько часов (в зависимости от исходного часового пояса). Если я устанавливаю часовой пояс для нового объекта, он изменяет значение, считая, опять же, что входное значение было UTC.

Я сделал некоторый Googling, но ничего не нашел в отношении PHP (существует несколько ответов для C#, которые я нашел). Возможно ли это с объектом DateTime (или с Carbon)? Я застрял с выполнением ручного добавления/вычитания часов на основе текущего часового пояса пользователей, чтобы поместить его в UTC первым?

ответ

7

Вы должны установить часовой пояс при создании объекта DateTime, а не когда он уже создан; затем изменить объект DateTime на UTC часовой пояс и сохранить его вам ДБ:

# create DateTime based on user timezone 
$dt = new DateTime('2014-09-18 17:00', new DateTimezone('Australia/Sydney')); 
# change time to UTC timezone 
$dt->setTimezone(new DateTimezone('UTC')); 
+0

Как-то я полностью пропустил эту опцию в конструктор DateTime. Благодаря! –