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
は、なぜあなたはDateIntervalを使用していない印刷し、UTCをしているUNIXタイムスタンプを使用するよりも、DateTimeオブジェクトと期間ではなく動作します:あなたがそのコードを実行するかどうかは明らかになりましたDTS対応ではありません –
datetime + dstデータをmysqlに格納する方法をモデル化しようとしていますが、そのバグが見つかりました。ループは単なる目的のためのものです。私が理解できないのは、DateTimeとdate()が異なる動作をする理由です。 –
このコードの後に '$ i = $ dt-> format(' U ');' $ iが文字列の場合は、数値として使用するので、予期しない結果が得られます。 – vascowhite