【发布时间】:2017-05-31 02:53:01
【问题描述】:
我试图从 ISO-8601 日期格式字符串输入计算一年中的星期。最初我用 java.time.ZonedDateTime 尝试了这个,但它给出了输入日期的错误结果 - 2049 年 1 月 2 日。然后我尝试使用日历 API,它也给出了 2049 年 12 月 31 日的错误响应。
我已附上示例测试代码
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
======================================
【问题讨论】:
-
请将该评论放入问题中 - 从逻辑上讲,它是问题的一部分。很遗憾,您没有在
Calendar部分的任何位置指定时区,这很容易影响结果。 -
请停止破坏格式。我现在已经两次修复了您的代码格式,两次您都撤消了它。然后我对结果进行了重新格式化,使其更易于阅读,而您再次撤消了它。
标签: java date calendar iso8601 zoneddatetime