⏲️

SimpleDateFormatで年を表すときはyyyy

2021/12/31に公開

個人的に関わっているまとめサイト作成のプロジェクトにて、12/31にバグレポートが上がってきました。

内容としては「GASのAPIから取得している日にちが1年後のものになってしまう」というもの。
まとめサイトのURLは、Google SpreadSheetで管理されており、GASで更新日時を取得するAPIを作成しておりました。
どうやら今回はそこのバグだと思われました。

数時間のズレであれば、タイムゾーンとかでは?とか予想が付きますが、1年となるとそういうわけでもなさそうです。
しかも、2021/12/31が2022/12/31になってしまうだけで、他の日にちには問題がないという、すごく気持ちの悪いバグでした。

調べてみると、GASのSimpleDateFormatに問題があることがわかりました。
https://developers.google.com/apps-script/reference/utilities/utilities
https://docs.oracle.com/javase/jp/8/docs/api/java/text/SimpleDateFormat.html
https://sysrigar.com/2018/12/31/暦週の基準年について/

SimpleDateFormatの年を表すyyyyとYYYYは、大文字と小文字で挙動が違うらしく、大文字で記載をすると、新年度の1月1日と同じ週を表す場合は、翌年として表示されてしまうとのこと。

sample.gs
function myFunction() {
  Logger.log(Utilities.formatDate(new Date("2021/12/30"), "JST", "YYYY/MM/dd"));
  Logger.log(Utilities.formatDate(new Date("2021/12/30"), "JST", "yyyy/MM/dd"));
}
実行結果
2022/12/30
2021/12/30

ここを知らずに大文字にしてしまうと、年末にだけ現れるバグになってしまうので、年末しっかり休みたかったら、小文字にしましょう。

Discussion