如何获得当年的总周数?

我在stackoverflow上获得了下面的代码,它返回当前年份的总周数,但它是硬编码的,它将在2014年和2016年不起作用。我如何动态获得本年度的总周数?

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

我这样做只是检查它是当前的方法?

  Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); cal.set(Calendar.YEAR, year); 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); 

使用以下代码

 Calendar mCalendar = new GregorianCalendar(); mCalendar.set(Calendar.YEAR, 2014); // Set only year mCalendar.set(Calendar.MONTH, Calendar.DECEMBER); // Don't change mCalendar.set(Calendar.DAY_OF_MONTH, 31); // Don't change int totalWeeks = mCalendar.get(Calendar.WEEK_OF_YEAR); 

一个月的30,28和29天不在乎。 一年的最后一天(任何一年)总是12月31日。所以你需要设定那一天。 mCalendar.get(Calendar.WEEK_OF_YEAR)将返回该年的总周数。


更新动态方式

 private int getTotalWeeksInYear(int year) { Calendar mCalendar = new GregorianCalendar(); mCalendar.set(Calendar.YEAR, year); // Set only year mCalendar.set(Calendar.MONTH, Calendar.DECEMBER); // Don't change mCalendar.set(Calendar.DAY_OF_MONTH, 31); // Don't change return mCalendar.get(Calendar.WEEK_OF_YEAR); } // Call as int totalWeeks = getTotalWeeksInYear(2014); 

在上面的代码中寻找bug。 当你可以使用下面的代码工作正常

 private int getTotalWeeksInYear(int year) { Calendar mCalendar = new GregorianCalendar(TimeZone.getDefault()); mCalendar.setFirstDayOfWeek(Calendar.MONDAY); // Workaround mCalendar.set(year, Calendar.DECEMBER, 31); int totalDaysInYear = mCalendar.get(Calendar.DAY_OF_YEAR); System.out.println(totalDaysInYear); int totalWeeks = totalDaysInYear / 7; return totalWeeks; } 

只需在此方法中使用当前年份:

 int year = Calendar.getInstance().get(Calendar.YEAR); cal.set(Calendar.YEAR, year); 

保持rest与示例中的相同。

我有一个DatePickerFragment,它的onDateSet函数

 public void onDateSet(DatePicker view, int year, int month, int day) { ((Main) getActivity()).setWeek(year, month, day); } 

仅返回年,月和日。 所以我必须做以下事情来得到一周。

 public void getWeek(int year, int month, int day){ final Calendar c = Calendar.getInstance(); c.set(year, month, day); int week = c.get(Calendar.WEEK_OF_YEAR); } 

你可以使用类似的东西

 private Calendar getCalendar(int year, int month, int day) { Calendar calendar = Calendar.getInstance(Locale.GERMAN); calendar.setFirstDayOfWeek(Calendar.MONDAY); calendar.set(year, month, day); return calendar; } private int getTotalWeeksInYear(int year) { return getCalendar(year, Calendar.DECEMBER, 31).get(Calendar.WEEK_OF_YEAR); } 

请记住,每周的定义是依赖于本地的。 这意味着在不同的语言环境中,get(Calendar.WEEK_OF_YEAR)的返回值会有所不同。 例如,在根据DIN 1355-1 / ISO 8601的Locale.GERMAN中,第一周是新年中包含4天或更多天的一周。 对于Locale.US,第一周是1月1日所属的周。

最快的方法是:根据您的来源,正确设置日历非常重要,因为周数的编号取决于给定的标准。 例如,在Europ中是ISO 8061.这意味着一年中的1周开始时01.01.RRRR是星期四或更远,而星期从星期一开始。

 GregorianCalendar gregorianCalendar = new GregorianCalendar(year,12,31); gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY); // week beginn from Monday gregorianCalendar.setMinimalDaysInFirstWeek(4); // 1week mininum from Thursday int totalWeeks = gregorianCalendar.getMaximum(Calendar.WEEK_OF_YEAR); 

为什么不使用Calendar getActualMaximum属性?

 private int getWeeksCount(final int year, final Locale locale) { Calendar calendar = Calendar.getInstance(locale); calendar.set(Calendar.YEAR, year); int totalWeekNumber = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR); return totalWeekNumber; } 

您可以使用Calendar.getActualMaximum(int)方法获取当前年份的总周数,如下所示:

 int totalNumberOfWeeks = Calendar.getInstance().getActualMaximum(Calendar.WEEK_OF_YEAR); 

简单。