我使用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在某一年之后/之前没有工作。我对这个问题一无所知。有谁知道它的解决方案?
答案 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。