取得した日付フォーマッタを使用して日付に解析しようとしているYYYYMMDD形式の日付文字列があります
public static DateFormat getDateFormat() {
SimpleDateFormat result = new SimpleDateFormat("yyyyMMdd");
result.setLenient(false);
return result;
}
プログラムが次のように実行されるときのデフォルトのタイムゾーンを設定します
public static void doTheDateZoneInit() {
TimeZone tzone = TimeZone.getTimeZone("Europe/London");
TimeZone.setDefault(tzone);
}
印刷文字列でタイムゾーンを指定せずに日付をフォーマットして出力すると
Date myDate= getDateFormat().parse("20110331");
System.out.println("Date after it is formatted:" + myDate);
出力はBSTタイムゾーンです
Date after it is formatted:Thu Mar 31 01:00:00 BST 2011
異なる日付で同じことを何度も実行すると、異なる出力が得られます
- 20120331 >> BST >> フォーマット後の日付:Sat Mar 31 01:00:00 BST 2012
- 20121231 >> GMT >> フォーマット後の日付:Mon Dec 31 00:00:00 GMT 2012
- 20130328 >> GMT >> フォーマット後の日付:Thu Mar 28 00:00:00 GMT 2013
- 20130331 >> GMT >> フォーマット後の日付:Sun Mar 31 00:00:00 GMT 2013
- 20140331 >> BST >> フォーマット後の日付:Mon Mar 31 01:00:00 BST 2014
- 20130401 >> BST >> フォーマット後の日付: Mon Apr 01 01:00:00 BST 2013
- 20130402 >> BST >> フォーマット後の日付:Tue Apr 02 01:00:00 BST 2013
- 20130501 >> BST >> フォーマット後の日付:Wed May 01 01:00:00 BST 2013
2012 年から 2013 年にかけて、すべてが GMT で計算される範囲があるようです。なぜこれが起こっているのか分かりません。
問題は、これらの日付に終業時間を追加することです...たとえば、文字列から変換した日付を使用して次のメソッドを呼び出し、最新の日付を取得するために 23:59:59:999 を追加します指定された日付の時間。
public static Date addAlmostOneDay(Date startDate) {
Calendar cal = new GregorianCalendar();
cal.setTime(startDate);
cal.add(Calendar.HOUR, 23);
cal.add(Calendar.MINUTE, 59);
cal.add(Calendar.SECOND, 59);
cal.add(Calendar.MILLISECOND, 999);
return cal.getTime();
}
しかし、23:59:59 を追加すると GMT に変換された場合... 日付を元の日付の終わりに設定するのではなく、BST と GMT の時間差を考慮に入れます
- Sun Mar 31 00:00:00 GMT 2013 は Mon Apr 01 00:59:59 BST 2013 (翌日 + 1 時間) になります。
- Mon Apr 01 01:00:00 BST 2013 は Mon Apr 01 23:59:59 BST 2013 になります (今日の終わりが私が望むものです)
なぜこれが起こっているように見えるのか、誰かが光を当てることができますか. YYYMMDD 形式の異なる入力で同じコードが実行されますか?