【问题标题】:Why do strtotime() and date() return 1969-31-12?为什么 strtotime() 和 date() 返回 1969-31-12?
【发布时间】:2014-04-11 05:34:27
【问题描述】:

我有这个代码:

$endDate='02-20-2014'; //Just updated this
echo date('Y-d-m',strtotime($endDate));

为什么strtotime() 一直给我1969-31-12

我的目标是得到:2014-02-20

【问题讨论】:

  • 为我工作:codepad.viper-7.com/1EEBIV(好吧,除了你的格式参数不正确)
  • 阅读 strtotime 的文档,很明显 a) 您使用的是早于 5.1.0 的 PHP 版本,b) strtotime 出错,c) 这会导致它返回 -1因此 d) 你得到 1969-31-12 23:59:59 的时间戳。因此,首先将您的 PHP 升级到一个不是直接退出中世纪的版本。也许这会自行解决您的问题。

标签: php date strtotime


【解决方案1】:

根本问题

PHP supported date formats 不包括您使用的输入日期格式,'02-20-2014'mm-DD-YY

为什么你会收到1969-31-12

由于您的输入格式错误,strtotime() 失败。在 PHP 5.1 及更高版本中,strtotime() 在这种情况下会返回 falsedate() 调用会评估为1970-01-01(即the day of the UNIX epoch)。

但是,在您的情况下,strtotime() 似乎在失败时返回 -1。这表明您使用的是过时版本的 PHP (5.0.x or less)。它还会导致date() 调用返回1969-31-12(即减去一秒的the UNIX epoch

解决方案

将您的输入日期格式更改为任何PHP supported date formats。另外,为了得到你指定的输出日期格式,2014-02-20或者YY-mm-dd,你应该把date()函数的format参数从Y-d-m调整为Y-m-d

例如:

$endDate='2014-20-02';
echo date('Y-m-d',strtotime($endDate));

关于 PHP 版本的附注

如果可能,强烈建议您将系统从过时的 PHP 5.0.x 版本迁移到最新版本。您应该仔细检查the change logs of each version migration ever since,以确保您没有破坏任何现有代码。

【讨论】:

    【解决方案2】:

    刚刚发现这个,并认为我应该添加更正和附加信息:

    m/d/y 或 d-m-y 格式的日期可以通过查看来消除歧义 各个组件之间的分隔符:如果分隔符是 斜线 (/),则假定为美式 m/d/y;而如果 分隔符是破折号 (-) 或点 (.),然后是欧洲 d-m-y 格式 假设。 (资源: Converting string to Date and DateTime)

    如果使用 strtotime 那么 02-20-2014 != 02/20/2014

    02-20-2014 将失败,因为没有第 20 个月

    2014 年 2 月 20 日是 2 月 20 日

    如果您使用上面详述的年份优先格式,例如

    $endDate='2014-20-02';
    

    那么中间的一对数字是总是一个月,所以无论你的日期是美国还是欧洲,这个日期都是无效的。

    echo date('Y-m-d',strtotime($endDate));
    

    echo date('Y-d-m',strtotime($endDate));
    

    都将失败,因为传递给 date 的第一个参数是输出格式,strtotime 已经失败,导致返回的日期为“1969-12-31”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      相关资源
      最近更新 更多