2014-01-23 56 views
0

我使用PHP-MongoDate將日期字段插入到MongoDB集合中。PHP - MongoDate - 負值不起作用

對於2014年5月29日,我試圖像下面

new MongoDate(1401321600)和它創造的Mongocollection ISODate("2014-05-29T00:00:00Z")這是正確

但對於1857年5月28日,我試圖像下面

new MongoDate(-3553200000)它在Mongocollection中創建了ISODate("1993-07-04T06:28:16Z")這是錯誤

但對於2045年5月29日,我試圖像下面

new MongoDate(2379628800)和它創造的Mongocollection ISODate("1909-04-22T17:31:44Z")這是錯誤

PHP MongoDate不工作後/某一年之前。我對這個問題毫無頭緒。任何人都知道它的解決方案?

+2

似乎是一個32位的unix時間戳問題,它不能處理1970年1月之前或2038年之後的日期(不確定可能)。 – Maerlyn

+0

@Maerlyn你有什麼想法解決這個瘋狂的問題? – user10

+0

您使用的是什麼版本的MongoDB PHP驅動程序?根據[PHP-423](https://jira.mongodb.org/browse/PHP-423),MongoDate在1.4.3驅動程序版本中支持32位系統上的64位時間戳。 – Stennie

回答

1

問題與32位整數與64位整數可以表示的值的範圍有關。如果您有64位PHP版本,則MongoDate類應按預期工作。

對於32位PHP版本,可以表示的日期值範圍通常在1970年1月1日至2038年1月19日之間。這與標準Unixtime format相同。

MongoDB驅動程序包含一些技巧,試圖解決在32位系統上使用64位數字的限制,其中包括糾纏64位數字字符串值的MongoInt64 class

如果您升級到MongoDB 1.4.3 PHP驅動程序版本或更新版本,則MongoDate類應支持32位系統上的64位時間戳(請參閱PHP-423)。

如果可能,更可靠的選擇是升級到64位版本的PHP。

+0

感謝您的回答。但這不公平。大家都以同樣的方式來做這件事嗎?這是Mongo PHPDriver中的錯誤嗎?他們沒有解決這個問題嗎?那麼MongoDate的用途是什麼? – user10

+0

@ user10:我做了一些進一步的挖掘,看起來有更好的答案。不幸的是,我沒有一個32位系統可以方便地進行測試,所以如果升級到PHP 1.4.3驅動程序(或更新的版本)對您有用或不起作用,請發表評論。 – Stennie

+0

我以前使用1.3.2.0。但是在你的評論後我改爲1.4.5.0。還沒有運氣。我在Windows 7 - 64位操作系統,我使用32位PHP版本。僅供參考,這是我本地的開發設置。我們的服務器在linux下運行。如果我在本地開發中解決了這個問題,我覺得我也可以修復服務器。 – user10

0

我也遇到過這個問題,並且新的驅動程序(1.4.3)不起作用。通過該修復中的註釋聲音,問題只得到了部分解決,因爲在2038之後或1902年之前僅使用PHP創建MongoDate是不可能的。

這很煩人,因爲32位PHP可以處理這個日期範圍,MongoDB也可以。困難點在於駕駛員無法駕馭。

只有當問題370得到修復時纔會真正解決(https://jira.mongodb.org/browse/PHP-370)。

與此同時,最好的解決方案似乎是將日期(在數據庫上)作爲字符串存儲,然後根據需要將字符串轉換爲PHP日期時間。