2011-08-25 78 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