Java中一年有几周、周的计算

Java中一年有几周、周的计算

文章目录

Java周如何计算生产环境代码

Java周如何计算

一般情况下java中一年有52周。但52周总共只有52*7=364天。我们知道,平年是365天,闰年则是366天,如果一年只有52周的话,就会差1到2天。所以每过几年,就会出现一年有53周。

java中的周计算有个规则,当年的最后几天可能会被算入下一年的第一周。

下面我们一起分析一个案例: 计算2017年12月31日是位于当年第几周:

Calendar cal = Calendar.getInstance();

cal.setFirstDayOfWeek(Calendar.MONDAY);

cal.set(Calendar.YEAR, 2017);

cal.set(Calendar.MONTH, 11);// 11表示的是12月

cal.set(Calendar.DATE, 31);

System.out.println(cal.get(Calendar.WEEK_OF_YEAR));// 53

2017年12月31日是位于当年第53周。 需要注意的是,java里面月份是从0开始的(0~11)。

再分析2017年1月1日的情况,你会发现2016年的最后6天加上2017年的第一天一起被算入了2017年的第一周。

Calendar cal = Calendar.getInstance();

cal.setFirstDayOfWeek(Calendar.MONDAY);

cal.set(Calendar.YEAR, 2017);

cal.set(Calendar.MONTH, 0);//0表示1月

cal.set(Calendar.DATE, 1);

System.out.println(cal.get(Calendar.WEEK_OF_YEAR));//1

也就是说2017年的53周里面,第一周只有1天,后面52周恰好占满整年剩下的天数,这跟2017年是365天吻合。

同样可以分析,2022年最后6天跟2023年1月1日,这7天一起被算成了2023年第一周。

生产环境代码

可以用一个带年份的int值来唯一表示某周,比如20240001表示2024年第一周。 计算方式如下:

/**

* 当年的最后几天可能会被算入下一年的第一周

* 如果是最后一个月的某天,需要检查是否是下年的第一周

*/

public static int getIntWeek(Calendar cal) {

cal.setFirstDayOfWeek(Calendar.MONDAY);

int year = cal.get(Calendar.YEAR);

int weekOfYear = cal.get(Calendar.WEEK_OF_YEAR);

if(weekOfYear==1 && cal.get(Calendar.MONTH)==11) {

year += 1;

}

return year*10000 + weekOfYear;

}

public static int getIntWeek(long time) {

Calendar cal = Calendar.getInstance();

cal.setTimeInMillis(time);

return getIntWeek(cal);

}

注意,我们国内通常以星期一作为一周的开始:

cal.setFirstDayOfWeek(Calendar.MONDAY);

相关数据