2017-08-02 39 views
1

我不明白爲什麼這是一個有效的日期(PHP)的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函數用於框架中的驗證日期,但是當用「false positive」日期去保存DB中的記錄時,會引發QueryException。 我解決了自定義驗證的問題,但我很想知道爲什麼strtotime有這種行爲。

+0

您是否嘗試過laravel中包含的'Carbon'類? –

+0

是的,我使用碳,但不能改變框架驗證規則。 無論如何,問題是與時間不在框架。 我剛剛解決了我在項目中的問題,但我想知道爲什麼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」,導致錯誤「Double timezone specification」。

+0

thx爲你的答案,這一切現在對我來說是有道理的。我從不嘗試date_parse函數。也許對於驗證比strtotime更有用。 –