问题:输入时间 输出XXXX年X月第X周(自然周)
计算规则:周日在哪个月这周就属于哪个月 周日在当月的第几周 该周就是当月第几周
解决思路:1.计算传入日期所在周的星期日 2.计算周日属于几月第几周
/**
* 获取指定日期-XXXX年X月第X周
* @param date
* @return
*/
public static String getWeeksInMonthOfDate(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
//设置每周第一天为周一 默认每周第一天为周日
calendar.setFirstDayOfWeek(Calendar.MONDAY);
//获取当前日期所在周周日
calendar.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
return String.valueOf(calendar.get(Calendar.YEAR)).concat("年").
concat(String.valueOf(calendar.get(Calendar.MONTH)+1)).concat("月第").
concat(String.valueOf(calendar.get(Calendar.WEEK_OF_MONTH))).concat("周");
}
1.获取传入时间所属周星期日
使用calendar.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY); 这个赋值获取结果 跟
calendar.getFirstDayOfWeek() 的值有直接关系
getFirstDayOfWeek()表示一周第一天是周几 取值1--7 默认是周日取值是1
以上图9.22为例 9.22所在周是9.19-9.25 用calendar.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);赋值后 9.22获取当前所在周周日 结果为9.19
如果设置calendar.setFirstDayOfWeek(Calendar.MONDAY);一周第一天是周一
还以上图9.22为例 9.22所在周变为9.20-9.26 用calendar.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);赋值后 9.22获取当前所在周周日 结果为9.26
注意:Calendar.SUNDAY的值始终是1 设置setFirstDayOfWeek(Calendar.MONDAY)一周开始日期是周一 不会影响Calendar.SUNDAY的取值
2.计算周日属于几月第几周
使用calendar.get(Calendar.WEEK_OF_MONTH)获取结果 跟calendar.getFirstDayOfWeek()和calendar.getMinimalDaysInFirstWeek()的取值有直接关系
getFirstDayOfWeek()前面已经说过了 下面看getMinimalDaysInFirstWeek()
getMinimalDaysInFirstWeek()默认值是1 用于确定年/月 交界处这周属于 上一年/上个月还是下一年/下个月 主要影响Calendar.WEEK_OF_MONTH和Calendar.WEEK_OF_YEAR的结果
以9.1为例 假设calendar.setFirstDayOfWeek(Calendar.MONDAY);一周第一天是周一 9.1所属周是8.30-9.5 9.1-9.5共有5天属于当前周 大于getMinimalDaysInFirstWeek()默认值1 则这周是9月的第一周 Calendar.WEEK_OF_MONTH返回1
如果设置setMinimalDaysInFirstWeek(6) 9.1所属周还是8.30-9.5 9.1-9.5共有5天属于当前周 不符合最小6天 则这周是8月第5周 Calendar.WEEK_OF_MONTH返回5
还以9.1为例看看calendar.getFirstDayOfWeek()和calendar.getMinimalDaysInFirstWeek()相互作用的效果
假如 getFirstDayOfWeek()取默认值 一周第一天是周日 则9.1所属周是8.29-9.4 当前周9.1-9.4共有4天属于当前周 若设置setMinimalDaysInFirstWeek(5) 不符合最小5天 则这周是8月第5周Calendar.WEEK_OF_MONTH返回5
保持setMinimalDaysInFirstWeek(5) 不变 修改calendar.setFirstDayOfWeek(Calendar.MONDAY);一周第一天是周一 9.1所属周变为8.30-9.5 9.1-9.5共有5天属于当前周 符合最小5天 则这周属于9月第一周 Calendar.WEEK_OF_MONTH返回1