2017-01-06 4 views
2

PHP 5.6でバグが見つかりました。パラメータ%Gの関数strftimeは、4桁の年を生成します。ただし、1483246800(2017年1月1日)を入力すると間違った年を返しているようです。代わりに2016が返されます。なぜstrftime( '%G'、strtotime( '2017-01-01'))は2016を生成しますか?

例のコードスニペット:

echo strftime('%G', strtotime('2017-01-01')); 

これは、 "2017" を印刷する必要がありますが、私は代わりに "2016" を得ます。私はPHP 5.6を実行しています。 このエッジケースは、他の年にも表示されます(例: 2016-01-03は2016の代わりに2015を出力します。

+0

あなたのロケールは何ですか? –

+4

これはISO週が月曜日から始まるので、2017年1月1日は2016年12月26日月曜日に始まった週にある日曜日です。代わりに 'Y'を使用したいと思うかもしれません。 – AbraCadaver

答えて

7

これはバグではありません。

他の誰かがしばらく前に提出されたバグレポートへの答えでsomeone pointed out通り:

%のG - 4桁の年は、ISO週番号に対応した(%Vを参照)。これは%Yと同じ形式と値を持ちますが、ISO週番号が前または次の年に属している場合、その年が代わりに使用されます ... ISO週番号についてのリマインダ。月曜日に始まり、日曜日に終了し、は、その日の過半数がとなる年の一部と考えられています。

これは、例えば(、次年今年の初め/終わりに近い日付の%Gを使用すると、あなたのケースのように、以前年、正しい年あなたを与えることができることを意味し、またはecho strftime('%Y', strtotime('2002-12-30))2003となる)。

正しい年を取得する場合は、代わりに%Yを使用してください。 echo strftime('%Y', strtotime('2017-01-01'));は2017年

を与えることもthe definition of %Vをチェックアウトする価値がある:

ISO-8601:月曜日があることと、少なくとも4つの平日に年の最初の週から始まる指定された年の1988年の週数、週の始まり

+0

これは意味が分かりますので、技術的には 'echo strftime( '%G'、strtotime( '2017-01-02'));'を入れると2017になるでしょうか? –

+0

ええ、彼はすべきです。 – shalvah

関連する問題