2012-05-04 17 views
20

は、テストコードです:新しい DateTime( '0000-00-00 00:00:00')の結果をどのように説明しますか?ここで

<?php 

ini_set('date.timezone', 'Europe/London');  
$dt = new \DateTime('0000-00-00 00:00:00'); 

var_dump($dt); 

これが用意されています

object(DateTime)[1] 
    public 'date' => string '-0001-11-30 00:00:00' (length=20) 
    public 'timezone_type' => int 3 
    public 'timezone' => string 'Europe/London' (length=13) 

これが有効な日付ではありません一方。私は戻り値、特に月を理解していない...あなたは説明することができますか?

+0

私は今、私の更新と同じようになる。しかし、私はまだ結果を理解していません:/私はPHP 5.3.5-1ubuntu7.7です – AlterPHP

+0

'新\ DateTime'のスラッシュは何ですか? –

+0

は実際に自分自身で答えを見つけました。この場合はスマートですが、誰かがDateTimeという名前のクラスを作成するのは疑いの余地がありません。 http://stackoverflow.com/a/4790031/882371 –

答えて

25

ここには2つの効果があります。

0000-01-01 same as 0000-01-01 
0000-01-00 same as -0001-12-31 
0000-00-01 same as -0001-12-01 
0000-00-00 same as -0001-11-30 

だから、日付自体が、すでに11月30日-1を指定します。最初のものは、あなたが複数のフォームに書き込むことができます日付の書き込みの方法を使用することです。

ここで、9分21秒で異なる時間オフセットが残っています。これは1911年3月10日23:51:38/39現地時間に起こったパリ/フランスのUTCと比較した時計の変化によるものです。


私はあなたのコードの例を少し変更し、役割を果たしているあなたはそれを持っているようヨーロッパ/パリ設定を導入しました。

$dt = new DateTime('0000-00-00 00:00:00', new DateTimeZone('Europe/Paris')); 
printf("%s secs offset from UTC\n", $dt->format('r T (e) Z')); 

私は1秒後の日付ビット

Fri, 10 Mar 1911 23:51:38 +0009 PMT (Europe/Paris) 561 secs offset from UTC 
                ^^^ 

を変更:このコードは、あなたが探しているものであるUTC(Z)からのオフセット秒としても語っている

Fri, 10 Mar 1911 23:51:39 +0000 WET (Europe/Paris) 0 secs offset from UTC 

When local standard time was about to reach Saturday, 11 March 1911, 00:01:00 clocks were turned backward 0:09:21 hours to Friday, 10 March 1911, 23:51:39 local standard time instead.

これは561秒です。参考:Clock changes in Paris - Time change dates in 1911およびTime zone changes and daylight saving time start/end dates between year 1900 and 1924

+0

私はこれが有効な日付ではないことを知っています、それは有効な出力を提供することはできませんでしたが、私の質問は "誰かがなぜその結果を知っていますか? – AlterPHP

+0

タイムゾーンは以前は何でしたか?通常、表示される2つの間に違いがあります(ここでは負のデルタ)。 – hakre

+0

@hakre興味深いことに、時間帯は30分しかなく、奇妙なオフセットは09分21秒です。さらに興味深いのは、-1年11ヶ月29日です。 0000-00-00 00:00:00」が有効な日付であるかどうかに関係なく、ちょうど奇妙です。 – Kaii

3

DateTimeのエラー処理が不完全であるように見えます。通常、他のPHP関数は '0000-00-00'をエラー(無効な日付)として扱います。

DateTimeは同じガイドラインに従うべきですが、そうではありません。

try { $dt = new \DateTime('0000-00-00 00:00:00'); } 
catch (Exception $e) { var_dump($e); } 
var_dump($dt); 
/* result: 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(20) "-0001-11-30 00:00:00" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Berlin" 
*/ 

その他の機能異常とその入力を処理します:

var_dump(strtotime('0000-00-00 00:00:00')); // returns: bool(false) 

は、PHPは常にそのような場合の取り扱いの問題があったように思える。それべきがあってもこのコードは、例外をスローしません。例:Bug #30190

Bug #60288は、PHPのバグトラッカーのコメントからの引用:

0000-00-00 is a non-existant date (the day before 01-01-0001 was 31/12/-0001)

関連する問題