2011-08-25 83 views
4

我知道這個問題是非常受歡迎的PHP的strtotime的日期小於1900

問這裏 PHP: strtotime is returning false for a future date? 這裏How can I work with dates before 1900 in PHP?

請問您能否確認我選擇返回false:

  1. 升級到64位架構

  2. 替換按日期時間+ DateInterval 的strtotime調用我們不能把DateTime-> getTimestamp但我們可以用DateInterval計算DIFF

我還有別的選擇嗎? 不幸的是,我不能選擇選項2,因爲我依靠ORM(Propel)+使用strtotime的很多遺留代碼。重構這些東西+定製ORM生成器可能比升級到64位更昂貴。

如果有人可以確認或提供任何其他選項,那將非常感激。

由於

日期格式爲標準的YYYY-MM-DD

PHP版本5.3.2

+0

工作,如果你指定的字符串是什麼格式這將有助於'的strtotime( )'接受多種格式,如果你有一個特定的格式可以提供幫助。 – Paulpro

+1

無論如何你應該升級到64位,沒有理由不這樣做。你必須最終。 – netcoder

+0

你用什麼PHP版本的方式? – netcoder

回答

3

AFAIK,你僅限於這兩種解決方案。

如果你能負擔得起,你應該更新到64位系統,如果它解決了問題,那就更好了。

編輯:就不得不檢查: http://php.net/manual/en/function.runkit-function-redefine.php 你也許可以嘗試和重新定義strtotime()與之前的日期,1901年

+0

'runkit'是一個選項,但它的最後一個更新日期可以追溯到2006年,所以它可能不會工作將近期版本的PHP('apd'更糟糕) – netcoder

+1

更新到64位將確實解決這個問題,儘管我會考慮切換到DateTime擴展。 – Narf

0

可以使用gregoriantojd,其具有4714的B.C.的日期範圍到9999 A.D.比1900(1970)-2038更廣泛的範圍。如果你正在計算日期差異,他們已經足夠接近了。那麼除了1582年10月4日到14日10天的「失落」之外。由於閏年計算的不同,你將每隔100年關閉一天。

+0

謝謝。但是,這意味着我將不得不重構每個使用strtotime調用gregoriantojd的調用 - 這與解決方案2非常相似,除了gregoriantojd僅適用於日期而不一定是時間戳。 – hbt

+0

嗚嗚,嗚嗚~~直到最近,大多數操作系統上的大多數標準時間/日期函數都不能表示早於1970年1月1日的日期。並且在2038年1月19日恢復爲「0」。 /en.wikipedia.org/wiki/Year_2038_problem。當然,解決方法是不使用標準日期/時間函數 - 以某種其他格式存儲日期(例如,字符串「1/1/1 ad」。 – paulsm4