(PHP)strtotime函数使用char进行误报

时间:2017-08-02 10:19:15

标签: php validation date laravel-5.3 strtotime

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

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,并且strtotime函数用于框架中的验证日期,但是当使用"误报"来保存DB中的记录时。 date引发QueryException。 我通过自定义验证解决了这个问题,但我很想知道为什么strtotime会出现这种情况。

1 个答案:

答案 0 :(得分:1)

这可能无法完全回答您的问题,但检查您的示例日期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
)

注意时区“N”,此外12不被解释为月份的日期,而是我怀疑“-12”被解释为附加的时区规范,因此警告。 < / p>

<强> 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,我怀疑字符串的其余部分被解释为2个时区, “-09”&amp; “-12”,导致错误“双时区规范”。