calcular el número de semanas en un año dado

Me gustaría obtener el número de semanas en un año determinado. Aunque 52 es aceptado como una respuesta mundial generalizada, los calendarios de 2015 , 2020 y 2026 tienen realmente 53 semanas.

¿Hay alguna forma en que pueda calcular esto, o alguna función que me ayude?

De acuerdo con el artículo de wikipedia sobre el formato de fecha de la semana ISO , puedes calcularlo usando el siguiente código.

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

Puede codificarse con la siguiente información de la fecha de la semana ISO.

En promedio, un año tiene 53 semanas cada 5.6 años.

Los siguientes 71 años en un ciclo de 400 años (agregue 2000 para los años actuales) tienen 53 semanas. Los años no listados tienen 52 semanas.

004, 009, 015, 020, 026, 032, 037, 043, 048, 054, 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.

Puede utilizar la información anterior para devolver 52 o 53 en consecuencia 🙂

Quick dos del trazador de líneas:

 Calendar calendar = Calendar.getInstance(); Integer weeksOfYear = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR); 
  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)); 

Me gustaría dar mi opinión sobre el uso de la nueva API de fecha en Java 8 con el siguiente código listo para ejecutar:

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

El resultado es:

2004 tiene 53 semanas
2009 tiene 53 semanas
2015 tiene 53 semanas
2020 tiene 53 semanas
2026 tiene 53 semanas
2032 tiene 53 semanas
...

Y así...

La date.withDayOfMonth(1).withMonth(6); el día de date.withDayOfMonth(1).withMonth(6); El truco es porque omitir esto da como resultado una salida ligeramente diferente si se LocalDate.of(year, 1, 1) :

2004 tiene 53 semanas
2005 tiene 53 semanas
...

Todavía soy nuevo en la API de fecha de Java 8, pero estoy bastante seguro de que este comportamiento se debe a que 2005-01-01 es parte de la semana 53 de 2014. Esto hace que date.range(WeekFields.ISO.weekOfWeekBasedYear()).getMaximum() devuelve el número de semanas para el año basado en la semana de 2014.

Enlace para responder

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

La respuesta de @Manjula Weerasinge en realidad introduce un error para 2016. Aquí hay una solución mejor.

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

Este método calcula el número de semanas por año ISO utilizando la biblioteca de tiempo Joda.

  import org.joda.time.DateTime; import org.joda.time.DateTimeZone; public static int weeksInYear(int year) { return new DateTime(DateTimeZone.forID("America/Los_Angeles")) .withWeekyear(year + 1) .withWeekOfWeekyear(1) .minusWeeks(1) .getWeekOfWeekyear(); }