问题
最近项目中要实现一个按照周查询功能,本来是一个简单功能,但是在测试出现一个问题,查询的数据和原本要的数据差了一周。后来发现是SimpleDateFormat和前端日期控件对每年的第一周定义不一样导致的。
前端的代码:使用week,今天是2021年7月17日,显示的本周今年的28周。
按照周:<input type="week" id="weekTime">
后端代码:
代码:
/**
* @author lingxiangchen
* @date 2021/7/17 15:11
*/
public class TimeTest {
public static void main(String[] args) {
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd");
Date newTime=sdf1.parse("2021-07-17");
SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-ww");
System.out.println(sdf2.format(newTime));
}
}
运行结果:
2021-29
后端运行的结果显示:本周是今年的29周。相差了一周。
原因
查资料才了解到,一年的第一周,是第一个满4天的一周。下图是html5中的week控件显示的效果。
图一:2021年第一周开始的时间是4号,不是1号。因为1号的这一周,不满4天。
图二:2020年1号这一天所在的周达到了4天,所以2020年1月1号这个周为第一周。
但是java中使用SimpleDateFormat这方法是:每年的一号为第一周的开始。
解决的方法
网上找到的解决方法:用Calendar,用setMinimalDaysInFirstWeek方法
/**
* @author lingxiangchen
* @date 2021/7/17 15:11
*/
public class TimeTest {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
calendar.setMinimalDaysInFirstWeek(4);//第一个满4天周才算一年的第一周
calendar.setTime(sdf.parse("2021-01-01"));
int weekNo = calendar.get(Calendar.WEEK_OF_YEAR);
int year=calendar.get(Calendar.YEAR);
System.out.println("year:"+year+" week:"+weekNo);
}
}
结果:
year:2021 week:53
可以看出,"周"对了。但是这里"年"不对,不过java这个年指的实际的年,不是周所在的年。