(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".
我不明白为什么这是一个有效的日期
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".