更改时区而不更改DateTime对象的值

时间:2014-09-19 16:57:39

标签: php date datetime php-carbon

这里是场景 - 我将PHP中的默认时区设置为UTC。我使用的所有日期/时间都设置为当前的UTC时间;如果稍后显示,我会为该特定用户设置时区,并在其时区中显示日期。效果很好。

除了我有一个日期/时间,用户可以在表格上输入。它来自" YYYY-MM-DD HH:MM"在24小时内(例如:" 2014-09-18 17:00")。用户自然会将此时间设置为他们的时区,而不是UTC。

如果我使用输入值创建一个新的DateTime对象,它将以UTC格式保存,因此稍后显示它会关闭几个小时(取决于原始时区)。如果我在新对象上设置时区,它会改变该值,再次假设输入值为UTC。

我已经完成了一些谷歌搜索,但没有发现任何关于PHP的内容(我已经找到了C#的几个答案)。这可能与DateTime对象(或使用Carbon)有关吗?我是否坚持根据用户当前时区手动添加/减少小时数以将其置于UTC中?

1 个答案:

答案 0 :(得分:11)

您必须在创建DateTime对象时设置时区,而不是在已创建时设置时区;然后将DateTime对象更改为UTC时区并将其保存到db:

# 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'));
相关问题