【问题标题】:(PHP) strtotime function false positive with char(PHP) strtotime 函数误报与 char
【发布时间】:2017-08-02 10:19:15
【问题描述】:

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

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

【问题讨论】:

  • 你试过 laravel 中包含的Carbon 类了吗?
  • 是的,我使用 Carbon,但无法更改框架验证规则。无论如何,问题在于 strtotime 而不是框架。我刚刚在项目中解决了我的问题,但我想知道为什么 strtotime 没有预期的行为。

标签: php validation date laravel-5.3 strtotime


【解决方案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”被解释为额外的时区规范,因此会发出警告。


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”,导致错误“双时区规范”。

【讨论】:

  • 感谢您的回答,现在对我来说一切都有意义。我从不尝试 date_parse 函数。 Maybe 对验证比 strtotime 更有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多