2017-01-12 8 views
2

こんにちは私はPHPのDateTimeに問題があります。それは10月のフランスDSTスルー5 "時間" のタイムスタンプ間のループ PHP DateTime vs date()DSTのシフトバグ?

date_default_timezone_set("Europe/Paris"); 
    echo $tz = date_default_timezone_get(); 
    echo "\n"; 

    $dt = new \DateTime("2017-10-29 00:00:00"); 
    $i = (int)$dt->format('U'); 
    $i_max = $i + 3600*5; 
    for(; $i < $i_max ; $i+=3600){ 
     $dt = new \DateTime(); 
     $dt->setTimezone(new \DateTimeZone($tz)); 
     $dt->setTimestamp($i); 

     echo $i."\n"; 
     echo $dt->format('c T e')."\n"; 
     echo date('c T e', $i)."\n"; 
     echo "\n"; 
    } 

は、次のスクリプトを考えてみましょう。 次に、日付をISO8601で表示し、そのタイムゾーンの識別子と省略形を表示します。第3の反復DateTime-間の結果>フォーマット()日付()は異なるで

Europe/Paris 

1509228000 
2017-10-29T00:00:00+02:00 CEST Europe/Paris 
2017-10-29T00:00:00+02:00 CEST Europe/Paris 

1509231600 
2017-10-29T01:00:00+02:00 CEST Europe/Paris 
2017-10-29T01:00:00+02:00 CEST Europe/Paris 

1509235200 
2017-10-29T02:00:00+01:00 CET Europe/Paris 
2017-10-29T02:00:00+02:00 CEST Europe/Paris 

1509238800 
2017-10-29T02:00:00+01:00 CET Europe/Paris 
2017-10-29T02:00:00+01:00 CET Europe/Paris 

1509242400 
2017-10-29T03:00:00+01:00 CET Europe/Paris 
2017-10-29T03:00:00+01:00 CET Europe/Paris 

ルック:

結果は以下です。

2017-10-29T02:00:00 + 01:00 CETヨーロッパ/パリ

しかし、それは日付()と同じことを示さなければならない:

のDateTimeは、この示し

2017-10-29T02:00:00 + 02:00 CESTヨーロッパ/パリ

私のミスです

date_default_timezone_set("Europe/Paris"); 

$dt = new \DateTime(); 
$dt->setTimestamp(1509235200); 
echo $dt->format('c T e')."\n"; 

echo date('c T e', 1509235200)."\n"; 

表示されます:

2017-10-29T02:00:00+01:00 CET Europe/Paris 
2017-10-29T02:00:00+02:00 CEST Europe/Paris 

と表示されるはずです:

--EDIT--

こんにちは、ここでは直接 "バグ" を指す別のスクリプトをあります

2017-10-29T02:00:00+02:00 CEST Europe/Paris 
2017-10-29T02:00:00+02:00 CEST Europe/Paris 
+1

は、なぜあなたはDateIntervalを使用していない印刷し、UTCをしているUNIXタイムスタンプを使用するよりも、DateTimeオブジェクトと期間ではなく動作します:あなたがそのコードを実行するかどうかは明らかになりましたDTS対応ではありません –

+0

datetime + dstデータをmysqlに格納する方法をモデル化しようとしていますが、そのバグが見つかりました。ループは単なる目的のためのものです。私が理解できないのは、DateTimeとdate()が異なる動作をする理由です。 –

+0

このコードの後に​​ '$ i = $ dt-> format(' U ');' $ iが文字列の場合は、数値として使用するので、予期しない結果が得られます。 – vascowhite

答えて

0

私はそのinc PHPバグ74274に関連しています。問題は、DateTimeが間違って動作していることです。

date_default_timezone_set("Europe/Paris"); 
$timestamp = 1509235200; 
$dt = new \DateTime(); 
$dt->setTimestamp($timestamp); 
echo $timestamp."\n"; 
echo $dt->getTimestamp()."\n"; 

それは

1509235200 
1509238800 
関連する問題