我想获得任何一年的周数。即使52
被接受为全球通用答案,2015
,2020
和2026
的日历实际上也有53
周。
我有什么方法可以计算出这个,或者任何可以帮助我的功能吗?
答案 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)
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周。