PHP - MongoDate - 负值不起作用

时间:2014-01-23 18:41:39

标签: php mongodb unix-timestamp

我使用PHP-MongoDate将日期字段插入MongoDB集合。

2014年5月29日,我尝试过以下

new MongoDate(1401321600)并在Mongocollection中创建ISODate("2014-05-29T00:00:00Z") 正确

但是对于05/28/1857,我尝试了如下

new MongoDate(-3553200000)并在Mongocollection中创建ISODate("1993-07-04T06:28:16Z") 错误

但是对于05/29/2045,我尝试了如下

new MongoDate(2379628800)并在Mongocollection中创建ISODate("1909-04-22T17:31:44Z") 错误

PHP MongoDate在某一年之后/之前没有工作。我对这个问题一无所知。有谁知道它的解决方案?

2 个答案:

答案 0 :(得分:1)

问题与可以用32位整数和64位整数表示的值范围有关。如果您有64位PHP构建,MongoDate类应该按预期工作。

对于32位PHP构建,可以表示的日期值范围通常在1970年1月1日到2038年1月19日之间。这与标准Unixtime format相同。

MongoDB驱动程序包含一些技巧,试图解决在32位系统上使用64位数字的限制,包括一个MongoInt64 class,它会纠缠64位数字的字符串值。

如果升级到MongoDB 1.4.3 PHP驱动程序版本或更新版本,MongoDate类应该支持32位系统上的64位时间戳(参见PHP-423)。

如果可能,更可靠的选择是升级到64位版本的PHP。

答案 1 :(得分:0)

我也遇到了这个问题,而新的驱动程序(1.4.3)也不起作用。通过该修复中的注释,问题只得到部分解决,因为在2038年之后或1902年之前仅使用PHP创建MongoDate是不可能的。

令人讨厌,因为32位PHP可以处理这个日期范围,MongoDB也可以。关键点是驱动力,无法管理。

当问题370得到修复(https://jira.mongodb.org/browse/PHP-370)时,它才真正得到解决。

与此同时,最佳解决方案似乎是将日期(在数据库上)存储为字符串,然后根据需要将字符串转换为PHP DateTimes。