2

PHP の DateTime 関数に問題があります。今日は12月3日月曜日。

次のコードを想定します。

$dte = new DateTime(date('Y-m-d H:i:s'));
var_dump($dte->format('Y-W'));
$dte->modify('+4 weeks');
var_dump($dte->format('Y-m-d H:i:s -- Y_W'));
$dte->modify('+1 days');
var_dump($dte->format('Y-m-d H:i:s -- Y_W'));

4 週間後、12 月 31 日になります。年の最後の週(52?)を取得すると思われます。しかし、次の出力でわかるように、2012 年の第 1 週が表示されます。

string '2012-49' (length=7)
string '2012-12-31 14:48:00 -- 2012_01' (length=30)
string '2013-01-01 14:48:00 -- 2013_01' (length=30)

だから私の問題は、最初の変更の後、私は得るべきだと思うということです:

2012-12-31 14:48:00 -- 2012_52

しかし、代わりに私は得る

2012-12-31 14:48:00 -- 2012_01

では、なぜ年をインクリメントせずに週が 01 に戻るのでしょうか?なぜ他の行で 2013_01 が返されるのでしょうか?

編集:: 前の週が 52 週であることがわかりました。閏年とは関係ありますか? しかし、繰り返しになりますが、年をインクリメントせずに週を 01 に戻すにはどうすればよいでしょうか?

4

2 に答える 2

4

では、なぜ週は年をインクリメントせずに01に戻るのでしょうか。また、他の行で2013_01が得られるのはなぜですか。

「週年」ではなく「年」を表示していると思います。週番号を使用している場合、関連する部分は週年です。単純な「年」は、月と日に関してのみ関連します。

編集:代わりにフォーマット指定子が必要だと思うので、試してみてください:o

var_dump($dte->format('Y-m-d H:i:s -- o_W'));

2013_01これは、2013年の週の第1週にあるため、2012年12月31日に表示されるはずです。

つまり、基本的に、これはバグではないと思います。これは、DateTime「1年の週」がどのように使用されるかについての誤解にすぎません。

于 2012-12-03T14:05:49.160 に答える
2

これはバグではないようです。ドキュメント によると、月曜日から始まる ISO-8601 の週番号 (PHP 4.1.0 で追加)Wが返されます。Mon, 31 Dec 2012 15:04:46 +0100152

ウィキペディアこの素敵なサイトに関する詳細情報.

于 2012-12-03T14:07:36.983 に答える