错误的时区MongoDate在PHP中

时间:2013-07-03 23:32:06

标签: php mongodb timezone

我通过MongoDBPHP中插入数据,一个字段是日期。因此,根据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中是否有设置可以避免此错误?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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

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

您应该了解许多时区全年都有多个偏移量。请参阅timezone tag wiki中的“时区!=偏移”。

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

答案 2 :(得分:0)

最新的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));