java中,在统计周的时候,默认一周是从周日开始的。但因为生活习惯或项目需求,我们经常需要改变一周的起始日期,这里说一下解决办法以及我陷入的误区。
一、 解决办法
使用Calendar类可以解决,这个类很灵活,功能很强大。
举个例子:
2020年1月1日是星期三,按照java的默认规则,2020年的第一个星期是:2019-12-29 星期日 至 2020-01-04 星期六。下面是日历:
因为项目需求,我们需要改成周一为一周的起始,即:2020年的第一个星期是:2019-12-30 星期一 至 2020-01-05 星期日。
代码如下:
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class test {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
c.set(2020, 0, 1);
System.out.println( sdf.format( c.getTime() ) );
// 先看一下2020-01-01是一年中的第几周
System.out.println( c.get( Calendar.WEEK_OF_YEAR) );
System.out.println("--------------------------------- ");
// 在不修改为周一的情况下,2019-11-29 周日 仍然是 2020年的第一周
// 而 2020-01-05 周日 是2020年的第二周
c.set(2019, 11, 29);
System.out.println( c.get( Calendar.WEEK_OF_YEAR) ); // 输出1,第一周
c.set(2020, 0, 5);
System.out.println( c.get( Calendar.WEEK_OF_YEAR) ); // 输出2,第二周
System.out.println("--------------------------------- ");
// 修改周的起始日期,则周的起止变为: 周一到周日
// 2019-11-29 周日,变为 2019年的最后1周; 2020-01-05 周日 是2020年的第1周
c.setFirstDayOfWeek( Calendar.MONDAY );
c.set(2019, 11, 29);
System.out.println( c.get( Calendar.WEEK_OF_YEAR) ); // 输出52,2019年的最后一周
c.set(2020, 0, 5);
System.out.println( c.get( Calendar.WEEK_OF_YEAR) ); // 输出1,第一周
}
}
输出:
2020-01-01
1
---------------------------------
1
2
---------------------------------
52
1
二、 我走进的误区
这个理解上还是比较容易的,但是有时候就防不住不小心钻进了牛角尖走不出来了,我就碰到了这种情况…
在Calendar中,周日返回1,周一返回2,依次类推。而setFirstDayOfWeek()
只影响WEEK_OF_YEAR。(未验证是否影响其他维度)
而我不知道怎么想的,这么认为:因为一周的起始日是周日,所以周日返回1,周一返回2;那么当我执行 setFirstDayOfWeek( Calendar.MONDAY)
以后,周日就应该返回7,而周一应该返回1…
我想了好长时间,才走出来…不知道有没有跟我一样可爱的男孩子(๑• . •๑)