提交了一个 PHP 的 bug,忐忑

2017-07-16 01:35:29 +08:00
 yaozeyuan93

这个 bug 是我领导发现的。

正常情况下给 strtotime 传数字会被忽略掉,然后返回 false,但今天发现当 strtotime 传入的时间戳大于 1500367000(2017-7-18 16:36:40),函数会返回数字。。。

测了下,php 从 5.3 到 7.1 都有这个 bug,会不会是个巨锅啊。。。

3718 次点击
所在节点    问与答
16 条回复
justplaymore
2017-07-16 02:17:08 +08:00
这不是 bug,1500367000 刚好匹配了一种合法的时间格式:15 时 00 分 36 秒 7000 年(中国标准时间 GMT+0800 ),和返回的结果的时间戳 158748447636 是匹配的。

如果参数是 1400367000 ( 14 时 00 分 36 秒 7000 年 中国标准时间 GMT+0800 ),也可以得到正确返回的,并不是因为参数大于某个值才出现这种结果,而是参数的格式符合某种时间格式的时候,参考下文档,时间和日期格式是可以混合在一起解析的。http://php.net/manual/en/datetime.formats.php
CEBBCAT
2017-07-16 02:17:18 +08:00
这属于什么测试?超前测试吗? doge
yaozeyuan93
2017-07-16 03:06:33 +08:00
@justplaymore

PHP 开发组回复我了,和你说的一样,确实是这样。

但如果只看文档的话,文档里说支持传入毫秒格式的时间戳,而且会自动忽略掉。20170101 按理说也是正经的毫秒时间戳,但是 strtotime 转换之后又能转成对应的日期,这样在日常使用中会让人很困惑

![]( )

我目前正在跑这种有坑的时间戳。目前的结果是如果按 HHMMSSYYYY 这种格式的话,对于所有以
$hh 10~24
$mm 01~02
$ss 36~60
$yyyy 7000~9999
形式构成的时间戳,都会被作为日期进行处理,如果不在这个范围内,则 strtotime 会返回正常值

如果要按这样推的话,
上一个乱纪元结束于 1402609999,2014-6-13 5:53:19
而这次的恒纪元则会在 1500610000,2017-7-21 12:6:40 开始

[捂脸]
justplaymore
2017-07-16 03:16:38 +08:00
@yaozeyuan93 你可能理解错了,strtotime 是参数是时间格式,不是时间戳。Microseconds began to be allowed ,but they are ignored. 这里的微秒是指时间格式里的微秒,而不是微秒级别的时间戳。

http://php.net/manual/en/datetime.formats.time.php
24 Hour Notation
Hour, minutes, seconds and fraction 't'? HH [.:] MM [.:] II frac "04.08.37.81412", "19:19:19.532453"
konakona
2017-07-16 04:42:03 +08:00
奇怪,up 主为什么要传你认为是 Unix 时间戳的值给 strtotime()?
EchoUtopia
2017-07-16 07:43:22 +08:00
据说这类 bug 有点多,我以前也遇到过
EchoUtopia
2017-07-16 07:44:53 +08:00
mcfog
2017-07-16 08:43:34 +08:00
敢在代码里依赖这种特性也是大心脏

老老实实地 return is_int($time) ? $time : strtotime($time); 不就好了,不如说如果你的某个变量可能一会儿是时间戳一会儿是时间字符串,那八成是整体的设计有问题吧
vibbow
2017-07-16 10:46:04 +08:00
@EchoUtopia 看了你那个文章,你那属于用法错误。

手册里写着的:
用 %G 或者 %g 作为指定时间戳相应周数的年份组成。
iyaozhen
2017-07-16 11:45:49 +08:00
str to time 这不是很好理解嘛。各种字符串形式的时间自动转成时间戳。几乎只要是正常的时间表示都没问题。楼主明显是用错了。
wdlth
2017-07-16 12:54:53 +08:00
我都用 DateTime 和 Carbon
v1024
2017-07-16 14:21:22 +08:00
所以要先去查源码
sagaxu
2017-07-16 15:30:08 +08:00
终于知道 php 为何被黑的这么惨了
dream7758522
2017-07-16 18:32:46 +08:00
php 是世界上最好的语言
FrankFang128
2017-07-16 18:56:47 +08:00
高级黑
yaozeyuan93
2017-07-16 20:24:56 +08:00
@sagaxu

一脚踩进乱纪元的坑里真是跪都不知道怎么跪的...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/375656

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX