ど忘れSEの備忘録

日々集めた何かしらを残すための何か。 共有とか疑問解決とかできたらいいな。 iPhoneとかiOSとかその他スクリプトとか色々。

SimpleDateFormatにおける日付書式による年ズレ問題

Javaのプログラムで、年が想定より1年進んで設定されるっていう事象が発生した。
しかも年末のみ。
結論から言うとどうやらSimpleDateFormatで指定する日付書式が原因だった模様。
以下のようなサンプルで検証。

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;

public class Test{
	public static void main(String[] args) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
		Date date = sdf.parse("2018/12/31");
		String sdate  = sdf.format(date);

		SimpleDateFormat sdf1 = new SimpleDateFormat("YYYY/MM/dd");
		String sdate1 = sdf1.format(date);
		
		String updateStr = sdf.format(date);
		System.out.print("yyyy:" + sdate + "\n");
		System.out.print("YYYY:" + sdate1);
		
	}
}

実行結果
yyyy:2018/12/31
YYYY:2019/12/31

うん、1年ずれてる。
書式指定の「yyyy」と「YYYY」の違いが原因らしい。

既に前例がいくつか報告されているので引用。

【yyyy】
年(西暦)を出力


【YYYY】
ある年における「最初の木曜日を含む週が、その年の第1週である」というルールで年(西暦)を出力。

例えば 2015/1/1 は木曜日なのでその週の日は日曜日~土曜日まで全て2015年の第1週という解釈になり、 2014/12/28(日曜)~2014/12/31(水曜) の時に YYYY を使うと 2015 を返します。

引用元
日付フォーマット yyyy と YYYY の違い - 強火で進め

なんつーシステム屋泣かせの仕様…。
幸い、複数機能のうち1か所だけだったしそこまで影響が大きくない機能だったからよかった…。
しかし年末に発生したバグが今頃みつかるっていうね…。
ログの出力方法を見直す必要がありそう。