java中Calendar类获取的自然周是从周日到周六,但是我们理解的一周是从周一到周日。所以依然使用Calendar记录weekOfYear,dayOfWeek会有两个问题:
1.周日这一天,按照两种计算方式所在的周(weekOfYear)不同;
2.查询一周的记录时,周几(dayOfWeek)是从周日到周六。
处理方式:
1.判断某天属于第几周
/**
* 判断具体某个周日属于第几周
*/
@Test
public void getWeekOfYear() throws ParseException{
String time = "2017-01-08";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(time);
/*
* 不做任何设置
*/
Calendar c = Calendar.getInstance();
c.setTime(date);
System.out.println(c.get(Calendar.WEEK_OF_YEAR));
/*
* 设置一周从周一开始,最少两天
*/
Calendar c1 = Calendar.getInstance();
c1.setTime(date);
c1.setMinimalDaysInFirstWeek(2);// 设置第一周最少2天
c1.setFirstDayOfWeek(Calendar.MONDAY);// 设置一周的第一天为周一
System.out.println(c1.get(Calendar.WEEK_OF_YEAR));
/*
* setFirstDayOfWeek:设置一周从周几开始
* setMinimalDaysInFirstWeek:设置第一周最少天数
* 这个是从一年的第一天开始计算,当前日期属于满足规则的第几周
*/
/*
* 设置一周从周日开始,最少两天
*/ Calendar c2 = Calendar.getInstance();
c2.setTime(date);
c2.setMinimalDaysInFirstWeek(2);// 设置第一周最少2天
c2.setFirstDayOfWeek(Calendar.SUNDAY);// 设置一周的第一天为周日
System.out.println(c2.get(Calendar.WEEK_OF_YEAR));
/*
* setFirstDayOfWeek:设置一周从周几开始
* setMinimalDaysInFirstWeek:设置第一周最少天数
* 这两个条件满足一个就能表示一周:2017-01-01满足一周从周日开始
*/
}
打印:2
1
2
2.周几
Calendar中周几的数值是固定的,SUNDAY就是1,MONDAY就是2,所以要存入想要的周几就要条件判断。
3.根据周查询日期
@Test
public void getDate(){
int year = 2017;
int week = 2;
/*
* 不做任何设置
*/
System.out.println("不做任何设置");
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);// 设置年
c.set(Calendar.WEEK_OF_YEAR, week); // 设置周
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);// 设置周几
System.out.println("周一:" + c.getTime());// 获取日期
c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);// 设置周几
System.out.println("周日:" + c.getTime());// 获取日期
System.out.println();
/*
* 设置一周从周一开始,最少两天
*/
System.out.println("设置一周从周一开始,最少两天");
Calendar c1 = Calendar.getInstance();
c1.setFirstDayOfWeek(Calendar.MONDAY);
c1.setMinimalDaysInFirstWeek(2);// 设置一周最少2天
c1.set(Calendar.YEAR, year);// 设置年
c1.set(Calendar.WEEK_OF_YEAR, week); // 设置周
c1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);// 设置周几
System.out.println("周一:" + c1.getTime());
c1.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);// 设置周几
System.out.println("周日:" + c1.getTime());
System.out.println();
/*
* 设置一周从周天开始,最少两天
*/
System.out.println("设置一周从周天开始,最少两天");
Calendar c2 = Calendar.getInstance();
c2.setFirstDayOfWeek(Calendar.SUNDAY);
c2.setMinimalDaysInFirstWeek(2);// 设置一周最少2天
c2.set(Calendar.YEAR, year);// 设置年
c2.set(Calendar.WEEK_OF_YEAR, week); // 设置周
c2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("周一:" + c2.getTime());
c2.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
System.out.println("周日:" + c2.getTime());
}
打印:
不做任何设置
周一:Mon Jan 09 17:34:07 GMT+08:00 2017
周日:Sun Jan 08 17:34:07 GMT+08:00 2017
设置一周从周一开始,最少两天
周一:Mon Jan 09 17:34:07 GMT+08:00 2017
周日:Sun Jan 15 17:34:07 GMT+08:00 2017
设置一周从周天开始,最少两天
周一:Mon Jan 09 17:34:07 GMT+08:00 2017
周日:Sun Jan 08 17:34:07 GMT+08:00 2017
综上:c1.setFirstDayOfWeek(Calendar.MONDAY);
c1.setMinimalDaysInFirstWeek(2);// 设置一周最少2天
这两个方法定义了一个自然周的条件(默认是Sunday和1)
获取自然周weekOfYear后,根据自然周查询日期也要设置相应的条件。