为什么unix时间戳需要以'@'作为strtotime()的前缀来理解它?

时间:2012-03-02 21:53:26

标签: php strtotime

我注意到strtotime()以奇怪的方式处理unix时间戳,如果有人知道原因,我很好奇:

var_export(strtotime('1330725042'));  // false
var_export(strtotime('@1330725042')); // 1330725042

为什么strtotime()在给定unix时间戳时返回false(除非所说的时间戳以@为前缀)?

这是我构建的库方法的内部结构,旨在将未知格式的变量“解析”为时间戳。在这种情况下使用裸strtotime()没有帮助,因为当传入值实际上是时间戳时,它会返回错误的结果。

我已经重新设计了库方法,以便对类似时间戳的值进行显式检查,并且不加修改地返回它,所以我们应该说,这个问题已经没有实际应用了。我只是好奇。

8 个答案:

答案 0 :(得分:5)

strtotime()收到的字符串必须采用特定格式。 http://www.php.net/manual/en/datetime.formats.php

如果strtotime()无法识别输入格式,则返回FALSE。由于unix时间只是一个数字序列,除非您明确指定使用的格式,否则它无法正确解析它们。在开始时放置@为函数提供该序列为unix时间格式的指令。

有关详细信息,请参阅以下文档: http://php.net/manual/en/function.strtotime.php

答案 1 :(得分:2)

可能是因为strtotime转换为一个UNIX时间戳,所以它并不期望将其作为参数。

阅读more

答案 2 :(得分:1)

因为strtotime意味着字符串到时间而您的“1330725042”不是时间字符串,而是用引号括起来的unix时间戳。

strtotime()用于“2-March-2012”等值。

如果您已将1330725042作为unix时间戳值,那么为什么需要使用strtotime()?

答案 3 :(得分:1)

strtotime()输出时间戳,其参数应该是日期的文本表示,所以你使用它错了。

答案 4 :(得分:0)

strtotime不识别unix时间戳,但是英文日期或相对时间(如“+1天”或“1个月”)

@p之前的值肯定会在调用中触发php的“忽略错误”模式,(有趣的副作用)因此让不可解析的值返回到var转储。

答案 5 :(得分:0)

其他人在使用函数时是正确的,并且它接受字符串而不是时间戳字符串。但是,如果您使用@符号获得结果,则可能是操作员表示以下文本是时间戳,或者该函数根据PHP的标准用法绕过错误。

无论哪种方式,你为什么要对时间戳进行strtotime?

答案 6 :(得分:0)

strtotime()用于将英文日期格式转换为unix时间戳,因此提供unix时间戳而不是日期格式将不能有效地使用此函数。可以在http://php.net/manual/en/datetime.formats.php

的php手册上看到接受的日期和时间格式

答案 7 :(得分:0)

答案是前导@表示unix时间戳日期格式,而整数本身是无效的日期格式。见:http://php.net/manual/en/datetime.formats.compound.php

为什么strtotime('@1 a')给出-3599的非错误结果,但我不知道。洛尔