给定一个日期计算这个日期是当年的第几周
求出带入的年份1.1是周几,设定为一周的开始,再计算当前的日期是一年的第几周
/**
* 计算出当年的1月1号是星期几,再计算出当前日期是一年中的第几周(以实际一年1.1星期为准)
* @param dateStr
* @return
* @throws Exception
*/
public static int weekOfYear3(String dateStr) throws Exception{
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(dateStr);
Calendar calendar = Calendar.getInstance();
//获取当年的1.1号是星期几
Calendar cal = Calendar.getInstance();
cal.set(Integer.valueOf(dateStr.substring(0, 4)), 0, 1);//日期设置成当前带入年的1.1号
int dayOfWeek=cal.get(cal.DAY_OF_WEEK);//这里求出的日期要去Calendar.SATURDAY 星期的值去对应
calendar.setFirstDayOfWeek(dayOfWeek); //当年1.1号星期
calendar.setTime(date);
//如果dateStr=2020-12-34转换后是2021-01-03 一般不会出现这种情况,因为前端输入一般都是用的时间控件
//if(!format.format(calendar.getTime()).equals(dateStr)) throw new Exception("转换后的时间和带入的时间不一致");
if(calendar.get(Calendar.WEEK_OF_YEAR)==1 && calendar.get(Calendar.MONTH)+1==12){
if(calendar.get(Calendar.DAY_OF_YEAR)==366 && calendar.get(Calendar.DATE)==31 && dayOfWeek==Calendar.SATURDAY){//如果一年366天,第一天是周六,则可能出现54周
return 54;//2000.12.31号是第54周
}else{
return 53;//如果求出的是第一周,并且月份是12月,直接返回第53周
}
}
return calendar.get(Calendar.WEEK_OF_YEAR);
}
固定一周的开始是周天,计算当前日期是一年的第几周
/**
*
* @Title: 获取当前日期是本年的第几周 (周日开始)
* @param: dateStr指定日期
* @param: @return
* @return: int
*/
public static int weekOfYear4(String dateStr){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.SUNDAY);
calendar.setTime(date);
if(calendar.get(Calendar.WEEK_OF_YEAR)==1 && calendar.get(Calendar.MONTH)+1==12){
if(calendar.get(Calendar.DAY_OF_YEAR)==366 && calendar.get(Calendar.DATE)==31){//如果一年366天,第一天是周六,则可能出现54周
Calendar cal = Calendar.getInstance();
cal.set(Integer.valueOf(dateStr.substring(0, 4)), 0, 1);//日期设置成当前带入年的1.1号
int dayOfWeek=cal.get(cal.DAY_OF_WEEK);//这里求出的日期要去Calendar.SATURDAY 星期的值去对应
if(dayOfWeek==Calendar.SATURDAY) return 54;//2020.12.31号是第54周
return 53;
}else{
return 53;//如果求出的是第一周,并且月份是12月,直接返回第53周
}
}
return calendar.get(Calendar.WEEK_OF_YEAR);
}
测试
public static void main(String args[]){
Calendar calendar = Calendar.getInstance();
calendar.set(2007, 11, 31);
System.out.println(calendar.getFirstDayOfWeek());
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
System.out.println(weekOfYear4("2012-12-31"));
}
测试的用例
2000 年12.31 号属于第54周
2028年12.31号是属于第54周
星期天一周的开始
闰年 1.1号从周一到周天
2024 1.1周一 6+517+3
2008 1.1周二 5+517+4
2020 1.1周三 4+517+5
2004 1.1周四 3+517+6
2016 1.1周五 2+517+7
2000 1.1周六 1+527+1
2012 1.1周天 0+52*7+2
517=357
527=364
平年 355天
2007 1.1周一 6+517+2=6+357+2
2019 1.1周二 5+517+3=5+357+3
2014 1.1周三 4+517+4=4+357+4
2009 1.1周四 3+517+5=3+357+5
2010 1.1周五 2+517+6=2+357+6
2011 1.1周六 1+517+7=1+357+7
2017 1.1周天 52*7