V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yaozeyuan93
V2EX  ›  问与答

提交了一个 PHP 的 bug,忐忑

  •  
  •   yaozeyuan93 · 2017-07-16 01:35:29 +08:00 · 3868 次点击
    这是一个创建于 2686 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个 bug 是我领导发现的。

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

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

    16 条回复    2017-07-16 20:24:56 +08:00
    justplaymore
        1
    justplaymore  
       2017-07-16 02:17:08 +08:00   ❤️ 1
    这不是 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
        2
    CEBBCAT  
       2017-07-16 02:17:18 +08:00 via Android
    这属于什么测试?超前测试吗? doge
    yaozeyuan93
        3
    yaozeyuan93  
    OP
       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
        4
    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
        5
    konakona  
       2017-07-16 04:42:03 +08:00
    奇怪,up 主为什么要传你认为是 Unix 时间戳的值给 strtotime()?
    EchoUtopia
        6
    EchoUtopia  
       2017-07-16 07:43:22 +08:00 via iPhone
    据说这类 bug 有点多,我以前也遇到过
    EchoUtopia
        7
    EchoUtopia  
       2017-07-16 07:44:53 +08:00 via iPhone
    mcfog
        8
    mcfog  
       2017-07-16 08:43:34 +08:00   ❤️ 1
    敢在代码里依赖这种特性也是大心脏

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

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

    一脚踩进乱纪元的坑里真是跪都不知道怎么跪的...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1010 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:03 · PVG 04:03 · LAX 12:03 · JFK 15:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.