PHP中的时区MongoDate错误


Wrong Timezone MongoDate in PHP

我通过PHPMongoDB中插入了数据,其中一个字段是日期。因此,根据MongoDB文档,我使用了new MongoDate()来实现这一点。

在MongoDB中,日期存储为ISODate("2013-07-03T22:56:12Z")。这意味着我的时区是Z(=0Z),所以时区等于0。
但我在美国西海岸,我所在的时区是8Z(太平洋时间)。

当我在终端的Mongo上输入new Date()时,一切都可以。日期是ISODate("2013-07-03T22:56:128Z"),所以这是正确的时区8Z

我的开发环境是Windows,MongoDB版本是2.4.4

是否需要在MongoDB、PHP代码或PHP.ini中设置一些内容来避免此错误?

您的数据库日期应该是UTC;然后PHP应该进行相应的调整——通常使用date_default_timezone_set。然后,您可以从数据库中获取日期,并将其插入到gmdate("y-m-d", strtotime($date))中。

8Z不是用ISO8601格式表示时区偏移量的有效方法。正确的方法是:

2013-07-03T22:56:12-08:00

除了-对于您提供的日期,美国太平洋时间为夏令时,因此-8不是正确的偏移量。应该是-7

2013-07-03T22:56:12-07:00

你应该明白,许多时区在一年中都有不止一次的偏移。请参阅时区标记wiki中的"时区!=偏移量"。

也就是说,我不确定MongoDB是否支持时区偏移,或者是否需要使用UTC。也许其他人可以对此发表评论或回答。

最新的MongoDate类作为toDateTime()函数,它允许您设置时区。

$mongoDate = new 'MongoDate();
$dateTime = $mongoDate->toDateTime()->setTimezone(new 'DateTimeZone(date_default_timezone_get()))

另一种方法是手动创建日期,如下所示。

//2017-02-03T13:37:07.000+00:00           
$currentDateTime = date('Y-m-d', time()).'T'.date('H:i:s', time()).'.000+00:00';
$mongoDate = new 'MongoDate(strtotime($currentDateTime));