Изменить часовой пояс без изменения значения объекта DateTime

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

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

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

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


person Nathan Loding    schedule 19.09.2014    source источник


Ответы (1)


Вы должны установить часовой пояс при создании 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'));
person Glavić    schedule 20.09.2014
comment
Как-то я полностью пропустил эту опцию в конструкторе DateTime. Спасибо! - person Nathan Loding; 22.09.2014