计算给定年份的周数

And*_*Guy 8 java android calendar

我想获得任何一年的周数.即使52被接受为全球通用的答案,日历也是如此2015,2020并且2026实际上有53几个星期.

有什么方法可以计算出来,或任何可以帮助我的功能吗?

Sam*_*uel 13

快速两个衬垫:

Integer weeksOfYear = Calendar.getInstance().getActualMaximum(Calendar.WEEK_OF_YEAR);
Run Code Online (Sandbox Code Playgroud)

  • 很高兴看到对这种方法的更详细的解释。`getActualMaximum` 根据当前时间迭代计算总数,而 `getMaximum` 只返回该字段的最大值。所以`getActualMaximum`确实是这个问题的答案。 (2认同)

Man*_*ula 12

根据维基百科有关ISO周日期格式的文章,您可以使用以下代码进行计算.

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2015);
    cal.set(Calendar.MONTH, Calendar.DECEMBER);
    cal.set(Calendar.DAY_OF_MONTH, 31);

    int ordinalDay = cal.get(Calendar.DAY_OF_YEAR);
    int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1; // Sunday = 0
    int numberOfWeeks = (ordinalDay - weekDay + 10) / 7;
    System.out.println(numberOfWeeks);
Run Code Online (Sandbox Code Playgroud)


COD*_*BOY 10

您可以使用ISO周日期的以下信息对自己进行编码.

平均而言,一年每5.6年有53周.

接下来的71年,在400年的周期中(当年增加2000年)有53周.未列出的年份有52周.

004,009,015,020,026,032,037,043,048,054,060,065,071,076,082,088,093,099,105,111,116,122,128,133,139, 144,150,156,161,167,172,178,184,189,195,201,207,212,218,224,229,235,240,246,252,257,263,268,274,280, 285,291,296,303,308,314,320,325,331,336,342,348,353,359,364,370,376,381,387,392,398.

你可以使用上面的信息相应地返回52或53 :)


Mag*_*lex 6

我想通过以下准备运行的代码来介绍Java 8中新的Date API的用法:

private static long getNumberOfWeeksInYear(LocalDate date) {
    LocalDate middleOfYear = date.withDayOfMonth(1).withMonth(6);
    return middleOfYear.range(WeekFields.ISO.weekOfWeekBasedYear()).getMaximum();
}

public static void main(String[] args) {
    for (int year = 2000; year < 2400; year++) {
        long numberOfWeeks = getNumberOfWeeksInYear(LocalDate.of(year, 1, 1));
        if (numberOfWeeks != 52) {
            System.out.println(year + " has " + numberOfWeeks + " weeks");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出为:

2004年有53周
2009年有53周
2015年有53周
2020年有53周
2026年有53周
2032年有53周
...

等等...

date.withDayOfMonth(1).withMonth(6);诀窍是因为如果忽略了此结果稍有不同的输出LocalDate.of(year, 1, 1)传递:

2004年有53周
2005年有53周
...

我仍然对Java 8日期API还是陌生的,但是我可以肯定的是,此行为是因为2005-01-01是2014年第53周的一部分。这使得date.range(WeekFields.ISO.weekOfWeekBasedYear()).getMaximum()返回基于2014年的周的周数。