2016-09-05 10 views
13

私はPHP DateDiffに問題があります。なぜ、各タイムゾーンが異なる結果を返すのか理解できません。たとえば、この場合プラハは0ヶ月、米国は1ヶ月戻ります。DateDiffは各タイムゾーンで異なる結果を返します

この相違点は何ですか?また、期待どおりに1ヶ月(30日、1ヶ月追加した場合)を返す方法は何ですか?

コードヨーロッパ/プラハ:

date_default_timezone_set("Europe/Prague"); 
$from = new \DateTimeImmutable('2016-09-01'); 
$to = $from->add(new \DateInterval('P1M')); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 

結果ヨーロッパ/プラハ:

object(DateTimeImmutable)#1 (3) { 
    ["date"]=> 
    string(26) "2016-09-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Prague" 
} 
object(DateTimeImmutable)#3 (3) { 
    ["date"]=> 
    string(26) "2016-10-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Prague" 
} 
int(0) 
int(30) 

-

コード米国/太平洋:

date_default_timezone_set("US/Pacific"); 
$from = new \DateTimeImmutable('2016-09-01'); 
$to = $from->add(new \DateInterval('P1M')); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 

結果、米国/太平洋:

object(DateTimeImmutable)#2 (3) { 
    ["date"]=> 
    string(26) "2016-09-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(10) "US/Pacific" 
} 
object(DateTimeImmutable)#4 (3) { 
    ["date"]=> 
    string(26) "2016-10-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(10) "US/Pacific" 
} 
int(1) 
int(0) 
+0

はあなたにも 'var_dump'ingの時間、分、秒、ミリ秒を気にしませんか? – Mchl

+0

これはPHP自体のバグでしょうか? –

+0

@MichaelHirschler多分、わからない、これが私の質問をSOに投稿した理由です – patie

答えて

1

実際これはPHP DateTimeクラスの小さなバグです。 あなたはUTCタイムゾーンを使用して計算した後、目的のタイムゾーンを設定する必要があります。

date_default_timezone_set('UTC'); 

$europePrag = new DateTimeZone('Europe/Prague'); 
$usPacific = new DateTimeZone('US/Pacific'); 

$from = new \DateTimeImmutable('2016-11-01'); 
$to = $from->add(new \DateInterval('P1M')); 
$from->setTimezone($europePrag); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 


$from = new \DateTimeImmutable('2016-11-01'); 
$to = $from->add(new \DateInterval('P1M')); 
$from->setTimezone($usPacific); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 
関連する問題