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