GoogleAppsScriptで作成したツールを用いてRedmineのチケットを整理しながら仕事をしていますが、
本日(2020/12/28)になって突然そのツールが動かなくなったので調査しました。
事象:Utilities.formatDateで日付型を文字列型に変換すると来年の日付に変わってしまう
日付型から文字列に変換を行う際には、一般的に以下のような処理を記述します。
Utilities.formatDate(date, timeZone, format);
日付には「2020/12/28 10:00:00」を入れて変換をしましたが、
出力された値は「2021/12/28 10:00:00」と来年の日付に変わってしまっていました。
検証:2020/12/27(日)~2020/12/31(木)の間で発生する
以下が検証結果です。
- 2020/12/26(土)までは問題なく2020年の日付に変換されました。
- 2020/12/27(日)から2020/12/31(木)までは来年の2021年が表示されました。
- 2021/01/01(金)からは問題なく指定した年の2021年が出力されました。
ここから憶測するに、曜日が関係あるのではないかと思い、追加で検証しました。
- 2021/12/25(土)までは問題なく2121年の日付に変換されました。
- 2021/12/26(日)から2021/12/31(金)までは来年の2022年が表示されました。
- 2021/01/01(土)からは問題なく指定した年の2022年が表示されました。
- 2022/12/31(土)までは問題なく2121年の日付に変換されました。
- 2023/01/01(日)からは問題なく指定した年の2022年が表示されました。
考察:指定した日が含まれる週の土曜日の年が返却されている
検証結果から、指定した日が含まれる週の土曜日の年が返却されていると思われます。
どちらにせよ、Utilities.formatDateを使用すると年末に機能が動かなくなりますため、
使用することはおすすめできないですね。
回避策:getFullYear()を用いる
幸い、日付型の関数である「getFullYear()」は正しい年が取得されました。
少し面倒ではありますが、日付型から文字列に変換する際はgetFullYear()等を用いて整形しましょう。