(PHP) strtotime 函数误报与 char

(PHP) strtotime function false positive with char

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

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 函数用于在框架中验证日期,但是当使用 "false positive" 日期在数据库中保存记录时,会引发 QueryException。 我通过自定义验证解决了这个问题,但我很想知道为什么 strtotime 有这种行为。

这可能无法完全回答您的问题,但检查 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”被解释为额外的时区规范,因此警告.


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”和“-12”,导致错误 "Double timezone specification".