计算给定年份的周数

时间:2012-01-04 08:17:21

标签: java android calendar

我想获得任何一年的周数。即使52被接受为全球通用答案,201520202026的日历实际上也有53周。

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

9 个答案:

答案 0 :(得分:13)

快速双线:

Calendar calendar = Calendar.getInstance();
Integer weeksOfYear = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR);

答案 1 :(得分:12)

根据维基百科关于ISO week date format的文章,您可以使用以下代码进行计算。

    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);

答案 2 :(得分:10)

您可以使用ISO week date.

中的以下信息对自己进行编码

平均而言,一年每5。6年有53周。

  

以下71年的400年周期(当年增加2000年)有53周。未列出的年份有52周。

     <00> 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:)

答案 3 :(得分:5)

我想在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");
        }
    }
}

输出结果为:

  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年的一周。

答案 4 :(得分:4)

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2015);
    cal.set(Calendar.MONTH, Calendar.DECEMBER);
    cal.set(Calendar.DAY_OF_MONTH, 31);
    System.out.println(cal.get(Calendar.WEEK_OF_YEAR));

答案 5 :(得分:2)

Link to answer

gregorianCalendar.set(year, 12, 31);
int totalWeeks = gregorianCalendar.getMaximum(Calendar.WEEK_OF_YEAR);

答案 6 :(得分:1)

@Manjula Weerasinge的答案实际上引入了2016年的一个错误。这是一个更好的解决方案。

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
GregorianCalendar gregorianCalendar = new GregorianCalendar();

int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (gregorianCalendar.isLeapYear(year)){
   if (weekDay == Calendar.THURSDAY || weekDay == Calendar.WEDNESDAY)
      return 53;
   else
      return 52;
} else {
   if (weekDay == Calendar.THURSDAY)
      return 53;
   else
      return 52;
}

答案 7 :(得分:1)

此方法使用Joda时间库计算ISO年份的周数。

gettext()

答案 8 :(得分:0)

对于ISO日期格式,我们可以如下计算周数:

int getNoOfWeeks(int year) {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year);
    cal.setMinimalDaysInFirstWeek(4);
    cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    return cal.getActualMaximum(Calendar.WEEK_OF_YEAR);
}

因此,对于= 2018年,它将返回52,对于2019年,它将也返回52,但是对于2020年,它将返回53,因为ISO年为52或53周。