27

テストコードは次のとおりです。

<?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)

これは有効な日付ではありませんが。戻り値、特に月がわかりません...説明してもらえますか?

4

2 に答える 2

30

ここでは2つの効果が見られます。1つ目は、複数の形式で記述できる日付の記述方法を使用することです。

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と比較した時計の変更によるものです。


コード例を少し変更し、ヨーロッパ/パリの設定を導入しました。これは役割を果たしています。Zこのコードは、探しているものである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'));

日付を少し変更しました

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

1秒後:

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

現地標準時が1911年3月11日土曜日に到達しようとしたとき、00:01:00の時計は、代わりに現地標準時の1911年3月10日金曜日の0:09:21時間に戻されました。

それは561秒です。参考:パリの時計の変更-1911年の時刻変更日1900年から1924年までのタイムゾーンの変更と夏時間の開始/終了日

于 2012-05-04T14:21:47.957 に答える
6

のエラー処理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は常にそのケースの処理に問題を抱えているようです。例:バグ#30190バグ#60288

PHPバグトラッカーのコメントから引用:

0000-00-00は存在しない日付です(01-01-0001の前日は31/12 / -0001でした)

于 2012-05-04T14:56:13.177 に答える