代码之家  ›  专栏  ›  技术社区  ›  Sergio Donati

(PHP)strotime函数带char的误报

  •  1
  • Sergio Donati  · 技术社区  · 7 年前

    我不明白为什么这是一个有效的日期

    strtotime("1920-09k-12") // -1556877600 // I expect false
    

    strtotime("1920-09-12d") // -1555905600 // I expect false
    strtotime("1920-09n-12") // -1556838000 // I expect false
    

    相反

    strtotime("1920-09k-12k") // false
    strtotime("1920r-09-12") // false
    strtotime("1920-09-12") // -1555862400
    

    我使用Laravel,strotime函数用于在框架中验证日期,但当使用“误报”日期在数据库中保存记录时,会引发QueryException。 我通过自定义验证解决了这个问题,但我很想知道strotime为什么会有这种行为。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Francis Eytan Dortort    7 年前

    这可能无法完全回答您的问题,但需要检查 date_parse() "Double timezone specification" ,如果出现错误 DateTime 无法创建。

    date_parse("1920-09-12d")

    Array
    (
        [year] => 1920
        [month] => 9
        [day] => 12
        [hour] => 
        [minute] => 
        [second] => 
        [fraction] => 
        [warning_count] => 0
        [warnings] => Array
            (
            )
    
        [error_count] => 0
        [errors] => Array
            (
            )
    
        [is_localtime] => 1
        [zone_type] => 2
        [zone] => -240
        [is_dst] => 
        [tz_abbr] => D
    )
    

    注意时区“D”


    date_parse("1920-09n-12")

    Array
    (
        [year] => 1920
        [month] => 9
        [day] => 1
        [hour] => 
        [minute] => 
        [second] => 
        [fraction] => 
        [warning_count] => 1
        [warnings] => Array
            (
                [8] => Double timezone specification
            )
    
        [error_count] => 0
        [errors] => Array
            (
            )
    
        [is_localtime] => 1
        [zone_type] => 2
        [zone] => 60
        [is_dst] => 
        [tz_abbr] => N
    )
    


    date_parse("1920r-09-12")

    Array
    (
        [year] => 
        [month] => 
        [day] => 
        [hour] => 19
        [minute] => 20
        [second] => 0
        [fraction] => 
        [warning_count] => 1
        [warnings] => Array
            (
                [5] => Double timezone specification
            )
    
        [error_count] => 1
        [errors] => Array
            (
                [8] => Double timezone specification
            )
    
        [is_localtime] => 1
        [zone_type] => 2
        [zone] => 300
        [is_dst] => 
        [tz_abbr] => R
    )
    

    注意时区“R”,而且没有解析日期,而是 1920 被解释为时间 19:20:00