私は、ISO-8601の日付形式の文字列入力から週を計算しようとしていました。当初はjava.time.ZonedDateTimeで試してみましたが、Input Date - 2041年2月2日に間違った結果が返されました。それから、Calendar APIを試してみましたが、それは2049年12月31日に間違った応答を返します。ZonedDateTimeとカレンダーAPIで週の問題を計算する
私はサンプルテストコードを添付している
public class ZonedDateTimeTest {
public static void main(String[] args) throws InterruptedException {
System.out.println("======================================");
String instantStr1 = "2049-01-02T03:48:00Z";
printYearAndWeekOfYear(instantStr1);
System.out.println("======================================");
String instantStr2 = "2049-12-31T03:48:00Z";
printYearAndWeekOfYear(instantStr2);
System.out.println("======================================");
}
public static void printYearAndWeekOfYear(String ISODate) {
System.out.println("Date provided -> " + ISODate);
ZonedDateTime utcTimestamp = parseToInstant(ISODate).atZone(ZoneOffset.UTC);
int year = utcTimestamp.getYear();
int weekOfYear = utcTimestamp.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
System.out.println("Using ZonedDateTime API:: Year " + year + " weekOfYear " + weekOfYear);
Date d1 = Date.from(parseToInstant(ISODate));
Calendar cl = Calendar.getInstance();
cl.setTime(d1);
int year1 = cl.get(Calendar.YEAR);
int weekOfYear1 = cl.get(Calendar.WEEK_OF_YEAR);
System.out.println("Using Calendar API:: Year " + year1 + " weekOfYear " + weekOfYear1);
}
public static Instant parseToInstant(String ISODate) {
return DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(ISODate, Instant::from);
}
}
======================================
Date provided 2049-01-02T03:48:00Z
Using ZonedDateTime API: Year 2049 weekOfYear 53
Using Calendar API: Year 2049 weekOfYear 1
======================================
Date provided 2049-12-31T03:48:00Z
Using ZonedDateTime API: Year 2049 weekOfYear 52
Using Calendar API: Year 2049 weekOfYear 1
======================================
上記のコードからの出力
質問*には、コメント*を論理的に入れてください。また、カレンダー部分のどこにでもタイムゾーンを指定していないと、結果に簡単に影響する可能性があることは残念です。 –
フォーマットを中断しないでください。私は今あなたのコードのフォーマットを2回修正しました。そして、あなたはそれを元に戻しました。私は結果を再フォーマットして読みやすくし、やり直しました。 –