Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Calendar.getWeeksInWeekYear返回同一年但在不同系统中的不同值_Java - Fatal编程技术网

Java Calendar.getWeeksInWeekYear返回同一年但在不同系统中的不同值

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

我用这个方法来计算一年中的弱者数量,但在我的计算机中,2020年的结果是53,而在服务器上的结果是52!! 我不知道为什么

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。第二,如果对周进行划分和编号,不同的地区有不同的方法,因此这两种结果可能都是正确的。