6

这是场景 - 我将 PHP 中的默认时区设置为 UTC。我使用的除一个日期/时间以外的所有日期/时间都设置为当前的 UTC 时间;稍后显示时,我为该特定用户设置时区,并且日期以他们的时区显示。效果很好。

除了我有一个用户可以在表单上输入的日期/时间。它在 24 小时内以“YYYY-MM-DD HH:MM”的形式出现(例如:“2014-09-18 17:00”)。用户自然会在他们的时区中设置这个时间,而不是 UTC。

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

我已经进行了一些谷歌搜索,但没有发现任何关于 PHP 的信息(我发现了 C# 的几个答案)。DateTime 对象(或 Carbon)可以做到这一点吗?我是否坚持根据用户当前时区手动加/减小时以首先将其放置在 UTC 中?

4

1 回答 1

12

您必须在创建对象时设置时区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'));
于 2014-09-20T05:40:43.947 回答