1.情景分析
今天在开发上有一个需求,无论今天是周几。我需要获取到上周周六的年月日,进行操作,经过一番折腾,总结了如下代码仅供参考。
public static void main(String[] args) {
//格式化时间 具体要啥格式你们自己写 EE是星期的意思 一般时候用不到的 年月日足以
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd EE");
//拿到今天的时间 这个时间如果你不要当前时间 要自己传时间进来 在这里进行修改即可
Calendar nowTime = Calendar.getInstance();
//!!!设置每周的第一天,我们中国人第一天是周一,切记修改这个,否则会出现获取周日的时候,时间错误的问题
//例如我今天是 2022-8-23周二 对于我们来说 本周的周日就应该是 8-28日 但是如果你没有设置初始时间
//你在去获取周日的时间 就会是8-21 因为默认周日是开始的日期
nowTime.setFirstDayOfWeek(Calendar.MONDAY);
//把现在的时间翻到我们指定的周几上,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
//这样我们就可以拿到我们所选的那个时间所在周的任意周X的日期了
//那基于这个 算出来的时间-7就是上周周X +7就是下周周X 哇塞的简单
nowTime.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
Calendar oldTime = new GregorianCalendar();
oldTime.setTime(nowTime.getTime());
//参数1: 1则代表的是对年份操作,2是对月份操作,3是对星期操作,5是对日期操作,11是对小时操作,12是对分钟操作,13是对秒操作,14是对毫秒操作
//参数2:把日期往后增加或者减去,整数 往后推,负数往前移动
oldTime.add(Calendar.DATE, -7);
System.out.println(format.format(oldTime.getTime()));
}
关于星期的问题,这里再一次说明。假如不设置每周开始时间,默认是周日(当然,这还跟时区啥的有关,这里不多介绍,我们就当周日来说)。可以看到今天是8-24号,我们正常来说,这周周日是8-28号,上周周日是8-21号。但是,使用默认配置的话,你的本周周日就是8-21号,上周周日就是8-14号,手动滑稽。
封装之后:
public static String getTimeByWeek(int week, int day) {
//格式化时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar nowTime = Calendar.getInstance();
//设置每周的第一天,我们中国人第一天是周一,切记修改这个,否则会出现周日的时间错误的问题
//例如我今天是 2022-8-23周二 对于我们来说 本周的周日就应该是 8-28日 但是如果你没有设置初始时间
//你在去获取周日的时间 就会是8-21 因为默认周日是开始的日期
nowTime.setFirstDayOfWeek(Calendar.MONDAY);
//把现在的时间翻到我们指定的周几上,SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY
nowTime.set(Calendar.DAY_OF_WEEK, week);
Calendar oldTime = new GregorianCalendar();
oldTime.setTime(nowTime.getTime());
//参数1:0代表世纪, 1则代表的是对年份操作,2是对月份操作,3是对星期操作,5是对日期操作,11是对小时操作,12是对分钟操作,13是对秒操作,14是对毫秒操作
//参数2:把日期往后增加或者减去,整数 往后推,负数往前移动
oldTime.add(Calendar.DATE, day);
return format.format(oldTime.getTime());
}
使用方式:
//获取上周周一
DateUtil.getTimeByWeek(Calendar.MONDAY, -7)
//获取下周周一
DateUtil.getTimeByWeek(Calendar.MONDAY, 7)
//获取本周周一
DateUtil.getTimeByWeek(Calendar.MONDAY, 0)
2.分析
以上代码可以实现 基于本周周X,查询出任意间隔天数的时间,例如,我可以查询到这周周四前54天的日期时间,或者是本周二以后28天是几月几日。而且Calendar 为jdk8新的api,无论是性能还是使用体验都遥遥领先于老的aip,推荐使用。