gpt4 book ai didi

php - strtotime 函数传递错误的日期和时间格式的奇怪行为

转载 作者:可可西里 更新时间:2023-11-01 13:14:21 24 4
gpt4 key购买 nike

我试图理解日期函数 strtotime() 的以下行为:

  • strtotime(1420066800) 按预期返回 false
  • strtotime(1451602800) 返回 26197048320!但预期 false 因为 1451602800 不是有效的日期和时间格式。 (与 new DateTime(1451602800) 相同)

我读了全文Supported Date and Time Formats页面,但未找到与此输入匹配的任何内容。

顺便说一句,这些是2015-01-012016-01-01的相对时间戳。

任何见解将不胜感激。

更新:
不同版本测试结果:

PHP 5.1.6  => false
PHP 5.2.17 => 26197048320
PHP 5.3.29 => 26197048320
PHP 5.4.34 => 26197048320
PHP 5.5.18 => 26197048320
PHP 5.6.2 => 26197048320
PHP 5.6.17 => 26197048320
PHP 7.0.2 => 26197048320

在 Mac OS X 10.11.3 上运行

最佳答案

让我们从正确的方法开始吧。如果你想将时间戳传递给 strtotime,你必须在它前面加上 '@'。在 Compound Formats 上有解释页面,在“本地化符号”->“Unix 时间戳”下。

echo(date('r', strtotime('@1420066800'))."\n");
echo(date('r', strtotime('@1451602800'))."\n");

输出是:

Thu, 01 Jan 2015 01:00:00 +0200
Fri, 01 Jan 2016 01:00:00 +0200

现在,为什么 strtotime() 1420066800 返回 false1451602800 返回 26197048320

它期望接收到一个字符串,如果它接收到一个它不关心的数字并首先将其转换为字符串。然后它遵循一些规则并尝试将日期组件识别到字符串中。因为 '1420066800''1451602800' 都不包含任何组件分隔符,它可能会尝试猜测组件的顺序。

今天,2016-02-25strtotime('1451602800') 生成一个时间戳,转换为可打印日期如下所示:'Fri, 2800 年 2 月 25 日 14:52:00 +0200'

这让我觉得它解释输入字符串如下:14:51:60 是时间,2800 是年份,其他组件(日、月) 从当前时间开始初始化。

文档说:

The function expects to be given a string containing an English date format and will try to parse that format into a Unix timestamp (the number of seconds since January 1 1970 00:00:00 UTC), relative to the timestamp given in $now, or the current time if $now is not supplied.

由于您提供的“日期”不遵循任何有效的日期时间格式,strtotime()可以自由返回任何值。它叫做"garbage in, garbage out" .

关于php - strtotime 函数传递错误的日期和时间格式的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35632682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com