2016-08-07 6 views
2

私は自分のプロジェクトにdate_default_timezone_setを使用する必要があり、date_diffを使用するまでは正常に動作しました。これは、選択したタイムゾーンに応じて良い結果と偽の結果が生成されるためです。 例:date_default_timezone_setは奇妙な結果を生み出しています。

date_default_timezone_set('America/Los_Angeles'); 

$first = date_create("2016-10-01"); 
$last = date_create("2016-10-31"); 
$diff = date_diff($first, $last); 
echo $diff->d; 

結果は30です。正しいですか。 今、私はヨーロッパにタイムゾーンを設定した場合:

date_default_timezone_set('Europe/London'); 

結果が0 は何が起こっているされましたか?

答えて

2

あなたは日がゼロと月にリセットしていることがわかりますvar_dump($diff)あなたは1にインクリメントしている場合:

object(DateInterval)#3 (15) { 
    ["y"]=> 
    int(0) 
    ["m"]=> 
    int(1) 
    ["d"]=> 
    int(0) 
    ["h"]=> 
    int(0) 
    ["i"]=> 
    int(0) 
    ["s"]=> 
    int(0) 
    ["weekday"]=> 
    int(0) 
    ["weekday_behavior"]=> 
    int(0) 
    ["first_last_day_of"]=> 
    int(0) 
    ["invert"]=> 
    int(0) 
    ["days"]=> 
    int(30) 
    ["special_type"]=> 
    int(0) 
    ["special_amount"]=> 
    int(0) 
    ["have_weekday_relative"]=> 
    int(0) 
    ["have_special_relative"]=> 
    int(0) 
} 

これはおそらくLondon switches back from DST on the last Sunday in Octoberという事実によるものです。しかし、明らかに30日ではなく「月」となる日付差が計算されます。

あなたはdaysプロパティwhich is will report 30使用してこれを克服することができます: `アメリカ/ Los_Angeles`または`ヨーロッパ/ London`を使用している場合、 `days`プロパティが30であることを

$first = date_create("2016-10-01"); 
$last = date_create("2016-10-31"); 
$diff = date_diff($first, $last); 
echo $diff->days; 
+2

注意を。これは、OPのためのより良い選択肢かもしれません。 – Chris

+0

もしあなたがしたら嬉しいです。 – Chris