Java Calendar.getWeeksInWeekYear返回同一年但在不同系统中的不同值
我用这个方法来计算一年中的弱者数量,但在我的计算机中,2020年的结果是53,而在服务器上的结果是52!! 我不知道为什么Java Calendar.getWeeksInWeekYear返回同一年但在不同系统中的不同值,java,Java,我用这个方法来计算一年中的弱者数量,但在我的计算机中,2020年的结果是53,而在服务器上的结果是52!! 我不知道为什么 Integer getNumberOfWeeksInYear(@PathParam("year") int year) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.D
Integer getNumberOfWeeksInYear(@PathParam("year") int year) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
return calendar.getWeeksInWeekYear();
}
两个答案——52周和53周——都是正确的。也就是说,在不同的地区 2020年是闰年,从周三开始,到周四结束。不同的地区以不同的方式计算周数。例如:
- 在突尼斯(ar TN locale),一周从周六开始,一年中的第一周是包含1月1日的一周。因此,第一周是从2019年12月28日星期六到2020年1月4日星期五。第52周为12月21日至27日。12月28日开始的一周被视为2021年的第一周。因此,2020年一周有52周
- 在ISO日历系统(国际标准)中,周从周一开始,第1周是新年至少4天的第一周。因此,第一周是从2019年12月30日星期一到1月5日星期日。第53周为2021年12月28日至1月3日(星期日)。所以有53周
- 您使用的
类设计糟糕,而且早已过时Calendar
- 在一些极端情况下,您的代码将无法正常工作。
根据默认语言环境提供了Calendar.getInstance
的具体子类的实例。它不能保证为您提供支持Calendar
的getWeeksInWeekYear()
日历,因此您的代码可能会崩溃
- 如果您在新年附近的某一天运行代码,而该天属于上一年或下一年的某一周,那么您将获得上一年或下一年的周数,而不是您查询的年份
WeekFields wf = WeekFields.of(Locale.forLanguageTag("ar-TN"));
int weekYear = 2020;
// The number of weeks is the same as the week number of the last week in the week year.
// So find a date in that last week and query its week number.
// The way to find a date in the last week is:
// find a date in week 1 of the following year and subtract 1 week.
LocalDate aDateInWeek1OfTheFollowingYear = LocalDate.of(weekYear + 1, Month.FEBRUARY, 1)
.with(wf.weekOfYear(), 1);
LocalDate aDateInLastWeek = aDateInWeek1OfTheFollowingYear.minusWeeks(1);
int lastWeekNumber = aDateInLastWeek.get(wf.weekOfYear());
System.out.format("Week year %d has %d weeks.%n", weekYear, lastWeekNumber);
此代码段的输出为:
2020年有52周
该方法当前无法编译。请你发布一个演示这个问题的帖子好吗?首先,不要使用
日历
,它是一个过时的旧类,而且它的设计总是很糟糕。查看java.time,现代java日期和时间API。第二,如果对周进行划分和编号,不同的地区有不同的方法,因此这两种结果可能都是正确的。