【问题标题】:PHP strtotime returning false for dates less than 1900PHP strtotime 为小于 1900 的日期返回 false
【发布时间】:2011-08-25 23:50:11
【问题描述】:

我知道这个问题很受欢迎

在这里问 PHP: strtotime is returning false for a future date? 在这里How can I work with dates before 1900 in PHP?

您能否确认我的选择:

  1. 升级到 64 位架构

  2. 将 strtotime 调用替换为 DateTime + DateInterval 我们不能调用 DateTime->getTimestamp 但我们可以使用 DateInterval 来计算差异

我还有其他选择吗? 不幸的是,我不能选择选项 2,因为我依赖于 ORM(Propel)+ 使用 strtotime 的大量遗留代码。重构这些东西 + 自定义 ORM 生成器可能比升级到 64 位更昂贵。

如果有人可以确认或提供任何其他选项,我们将不胜感激。

谢谢

日期格式是标准的yyyy-mm-dd

PHP 版本 5.3.2

【问题讨论】:

  • 如果您指定字符串的格式会有所帮助。strtotime() 接受多种格式,如果您有特定的格式可以提供帮助。
  • 无论如何你都应该升级到 64 位,没有理由不升级。你最终必须这样做。
  • 顺便问一下你用的是什么PHP版本?

标签: php strtotime


【解决方案1】:

AFAIK,您仅限于这两种解决方案。

如果你负担得起,你应该更新到 64 位系统,如果它解决了问题那就更好了。

编辑:只需检查: http://php.net/manual/en/function.runkit-function-redefine.php 您可能可以尝试重新定义 strtotime() 以使用 1901 年之前的日期。

【讨论】:

  • runkit 是一个选项,但它的最后一次更新可以追溯到 2006 年,因此它可能无法在最新版本的 PHP 中工作(apd 更糟)。
  • 更新到64位确实可以解决这个问题。虽然,我会考虑切换到 DateTime 扩展。
【解决方案2】:

您可以使用 gregoriantojd,它的日期范围是公元前 4714 年。到公元 9999 年。比 1900(1970)-2038 年范围更广。如果您尝试计算日期差异,它们就足够接近了。好吧,除了 1582 年 10 月 4 日至 14 日“丢失”的 10 天。而且由于闰年的计算方式不同,您每 100 年将减少一天。

【讨论】:

  • 谢谢。但是,这意味着我必须将使用 strtotime 进行的每个调用重构为 gregoriantojd——这与解决方案 2 非常相似,除了 gregoriantojd 仅适用于日期而不一定是时间戳。
  • 呜呜呜呜 :) 直到最近,大多数操作系统上的大多数标准时间/日期函数都不能表示早于 1970 年 1 月 1 日的日期。并在 1 月恢复为“0” 2038 年 19 月 19 日。en.wikipedia.org/wiki/Year_2038_problem。当然,解决方法是不使用标准日期/时间函数 - 以其他格式存储日期(例如,字符串“1/1/1 a.d.”。
猜你喜欢
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多