2017-08-02 7 views
1

と偽陽性私は理解していません。(PHP)のstrtotime関数は、char

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にレコードを保存するとQueryExceptionが発生します。 私はカスタムバリデーションの問題を解決しましたが、なぜstrtotimeにこのような動作があるのか​​不思議です。

+0

laravelに含まれている 'Carbon'クラスを試しましたか? –

+0

はい私はCarbonを使用しますが、フレームワークの検証ルールを変更することはできません。 とにかく、問題はフレームワークではなくstrtotimeにあります。 私はちょうどプロジェクトで私の問題を解決しましたが、私は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として解釈され、そしてIは、文字列の残りの部分がある疑い2つのタイムゾーンとして解釈され、 "-09" & "-12"となり、 "Double timezone specification"というエラーが発生します。

+0

あなたの答えは、それはすべて今私のために意味があります。私はdate_parse関数を試してみません。おそらく、strtotimeよりも検証に便利です。 –