我通过PHP
在MongoDB
中插入了数据,其中一个字段是日期。因此,根据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));