代码之家  ›  专栏  ›  技术社区  ›  ACV

SimpleDateFormat错误的一年中的最后一周

  •  -2
  • ACV  · 技术社区  · 3 年前

    例子:

    这将正确生成第52周:

    SimpleDateFormat w = new SimpleDateFormat("w");
    Calendar c = Calendar.getInstance();
    c.set(2021, 11, 25);
    System.out.println("Week: ${w.format(c.getTime())}");
    

    Week: 52

    但是第二天已经被认为是明年的第一周了?

    SimpleDateFormat w = new SimpleDateFormat("w");
    Calendar c = Calendar.getInstance();
    c.set(2021, 11, 26);
    System.out.println("Week: ${w.format(c.getTime())}");
    

    生产: Week: 1

    这只发生在Java7中,而不是Java8和更高版本中!

    1 回复  |  直到 3 年前
        1
  •  3
  •   rzwitserloot    3 年前

    不要使用 Calendar 糟透了 应用程序编程接口。

    有一张和我的腿一样长的单子,上面有什么毛病。在这里,大约200件相关的事情中,有一件具体的是,它的月份值是 0 索引。那么,“12,3”?这是第三部《不死族》,或者随便你怎么称呼 . 或者日历不包括第13个月,在这种情况下,它只是宽大地假设你的意思是2022年1月3日。不管怎样,那都是第一周。

    那么,为什么第二届undecimber(或者如果你愿意,通过展期,2022年1月2日)是“第52周”?

    Because it is

    使用 java.time 相反

    LocalDate ld = LocalDate.of(2021, 12, 3);
    WeekFields wf = WeekFields.of(Locale.ENGLISH);
    int weekNumber = ld.get(wf.weekOfWeekBasedYear());
    

    JAVA时间做很多事情都很奇妙,其中一件伟大的事情就是它不会隐藏复杂的事情。例如,“一周什么时候开始”是 除非你告诉我你问这个问题的地方。因此,“现在是哪一周”是 告诉我,我们使用的是一个可以被普遍接受的计数系统,直到有一个可以被普遍接受的标准。因此,你 不得不 做一个单独的计划是很繁琐的 WeekFields 实例来捕获该信息。我们在这里是基于区域设置的。

        2
  •  0
  •   ACV    3 年前

    Calendar 例如,如果在12月29日运行第1周,也会显示:

    System.out.println("Week: ${new SimpleDateFormat("w").format(new Date())}");

    但它是针对Java7的。它是用Java8修复的。

    我在这里找到了解释(正如@rzwitserroot也解释的):

    https://docs.oracle.com/javase/8/docs/api/java/util/GregorianCalendar.html

    第一周和最后一周(含)具有相同的周-年值。 因此,一年中一周的第一天和最后几天可能会有不同的结果

    例如,1998年1月1日是星期四。如果getFirstDayOfWeek()为 星期一和getMinimalDaysInFirstWeek()为4(ISO 8601标准 然后1998年的第一周从1997年12月29日开始 , 星期日,然后是1998年第1周,开始于1998年1月4日,结束于 1997年的第53周,他们的周年是1997年。