🐘
CakePHP(i18nFormat)の'y'と'Y'の話。
はじめに
変な挙動をたまたま見つけたので、メモった次第。
何が起きたか
CakePHPを使っている中で、日付周りで変な挙動を見つけた。ひとまず再現する。
i18n-format.php
$time = new FrozenTime('2021-12-26 11:22:33', 'Asia/Tokyo');
echo $time->i18nFormat('YYYY/MM/dd') . PHP_EOL;
echo $time->i18nFormat('yyyy/MM/dd');
// 結果
2022/12/26
2021/12/26
?!
Cake\I18n\FrozenTime::i18nFormat
を使う際のフォーマットとしてYYYY
とyyyy
で年数が違う。ちょっとよく分からないので色々調べてみた結果、i18nFormat
はIntlDateFormatter
でフォーマットしていることが判明した。下の_formatObject
にそれが書かれてた。
以下のソースコードを参照
で、最後の引数はUnicodeになっており、年数に関して指定できるパターンがy
とY
とがある、他にもu
とかもいけると書いてあるが一旦無視。
Pettern | Meaning |
---|---|
y |
year |
Y |
year of “Week of Year” |
Week of Yearって考え方があるようで、概要は以下。
ある年における「最初の木曜日を含む週が、その年の第1週である」というルールで年(西暦)を出力。
なので年末の日付を入力値にした時、次の年が返される。
まとめ
結論、yyyy
とすれば、西暦通りの出力となるので、一件落着。
参考ページ
Discussion