在Calender里,如果你想要获取关于“周”的一些内容,不可避免地要清楚一点,
那就是JAVA里面的周,取值范围只有1~53
还需要使用两个设置
它们分别是:
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.setMinimalDaysInFirstWeek(4);
setFirstDayOfWeek()
是指定哪一天作为周的第一天,通常你不需要去设置它,因为它会读取系统时区,判断你是处于周一是第一天的国家,还是周日是第一天的国家。但是你去设置它也没有错。
setMinimalDaysInFirstWeek()
是指每年的第一个星期的最小天数,它默认值是1.
这是什么意思?
如下图:
这是2020年元旦的这一周,如果按照默认值,那么这一周就是2020年的第一周,2019.12.31也是2020年的第一周里面。
使用元旦这一天去调用Calender的是哪一周时calendar.get(Calendar.WEEK_OF_YEAR)就得到了答案:1
但是如果你设置setMinimalDaysInFirstWeek = 6
那么你调用的结果就不是1,而是52(或者53),Calender把这周算到去年里面了,本周是去年的52周或53周。
因为这一周从周一开始算起的话,在2020年只有5天,而你设置的本年度第一周的最小天数是6天,不符合,所以把它的周放到去年了。在这种情况下,不仅是calendar.get(Calendar.WEEK_OF_YEAR)值变成了52或53,同样的,calendar.getWeekYear()也变成了去年。注意,这个不是当前日期的年份,而是当前周的年份,它和calendar.get(Calendar.YEAR)是不一样的。
那么这个setMinimalDaysInFirstWeek()值,应该设定为多少?
应该设定为4!!!
为什么?
因为在其他系统里计算周也有各种各样的方法,但是无论怎么花样,总有一个类似于这样:
一周一共有7天,不可能平分,如果大于等于4天,算到这边,如果小于4则算到那边。
比如mysql的week函数,参数选择mode = 3 就代表着设置下面这俩:
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.setMinimalDaysInFirstWeek(4);
这样的话,java和mysql在周数据进行了完美的统一
关于mysql的week周函数讲解详情见:mysql根据周查询统计,比如week()或者DATE_FORMAT或者跨年要注意的几点