前排提醒:若使用
SimpleDateFormat
解析时间错12H,文末有详细解决办法;
由于需要统计某一时间段内的数据,必须以起止时间作为条件进行查询,并且需要跟其他周期的数据进行对比,所以需要对时间进行各种操作,记录方便后面查看!
需求,根据传参以年、月,日为时间段获取统计数据,并且获取上一个统计周期的数据进行比较
例如2023-3-14 15:25:25
如果是按年则是今年的,则上一个统计周期为去年
如果按月或者按天,则上一个统计周期直接在月份上减1或者在日期上减1会出现边界问题,所以需要进行如下处理。
//根据type获取起止时间
String type=request.getParameter("type");
String startTime="";
String endTime="";
String oldStartTime="";
String oldEndTime="";
Calendar date = Calendar.getInstance();
LocalDate localDate=LocalDate.now();
LocalDate localDate1 = localDate.minusMonths(1);
LocalDate localDate2 = localDate.minusDays(1);
String year = String.valueOf(date.get(Calendar.YEAR));
// year="2022";
String month = String.valueOf(date.get(Calendar.MONTH));
Integer integer = Integer.valueOf(month)+1;
String day = String.valueOf(date.get(Calendar.DAY_OF_MONTH));
if(type.equals("year")){
//第一天00:00:00
startTime=year+"-01-01 00:00:00";
oldStartTime=(Integer.valueOf(year)-1)+"-01-01 00:00:00";
//最后一天 59:59:59
endTime=year+"-12-31 23:59:59";
oldStartTime=(Integer.valueOf(year)-1)+"-12-31 23:59:59";
}else if(type.equals("month")){
//第一天00:00:00
Calendar cc=Calendar.getInstance();
Date parse = df.parse(localDate1.toString());
cc.setTime(parse);
int old = cc.getActualMaximum(Calendar.DAY_OF_MONTH);
startTime=year+"-"+integer+"-01 00:00:00";
oldStartTime=cc.get(Calendar.YEAR)+"-"+( cc.get(Calendar.MONTH)+1)+"-01 00:00:00";
int maximum = date.getActualMaximum(Calendar.DAY_OF_MONTH);
endTime=year+"-"+integer+"-"+maximum+" 23:59:59";
oldEndTime=cc.get(Calendar.YEAR)+"-"+( cc.get(Calendar.MONTH)+1)+"-"+old+" 23:59:59";
}else if(type.equals("day")){
Calendar cc=Calendar.getInstance();
Date parse = df.parse(localDate2.toString());
cc.setTime(parse);
oldStartTime=cc.get(Calendar.YEAR)+"-"+( cc.get(Calendar.MONTH)+1)+"-"+cc.get(Calendar.DATE)+" 00:00:00";
oldEndTime=cc.get(Calendar.YEAR)+"-"+( cc.get(Calendar.MONTH)+1)+"-"+cc.get(Calendar.DATE)+" 23:59:59";
startTime=year+"-"+integer+"-"+day+" 00:00:00";
endTime=year+"-"+integer+"-"+day+" 23:59:59";
}
顺便整理关于日期的常用操作
Date DateFormate Calendar LocalDate LocalDateTime
Date 可以获取当前时间戳
DateFormate 对时间进行格式化操作
LocalDate LocalDateTime 可以方便的对时间进行加/减一天、一月、小时等操作
Calendar 根据指定的字符串生成指定的日期,并可方便的获取年份,月份,周几,几号,本月最大天数,等信息
补充内容,给一个时间,获取某个某个时间段的起止时间,比如,拉取5小时内的数据,由于调用的是第三方接口,且需要在定时任务中调用,需要传起止时间,且时间不定,为方便随时更改规则,直接统一一个方法:
private List<String> getBetWeenTimes(Integer count,String unit) {
List<String> list=new ArrayList<>();
Date current=new Date();
DateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
Calendar calendar = Calendar.getInstance();
calendar.setTime(current);
switch (unit){
case "year":
calendar.add(Calendar.YEAR, -count);
break;
case "month":
calendar.add(Calendar.MONTH, -count);
break;
case "day":
calendar.add(Calendar.DAY_OF_MONTH, -count);
break;
case "hour":
calendar.add(Calendar.HOUR_OF_DAY, -count);
break;
case "min":
calendar.add(Calendar.MINUTE, -count);
break;
default:
calendar.add(Calendar.SECOND, -count);
break;
}
Date from = calendar.getTime();
list.add(df.format(from));
list.add(df.format(current));
return list;
}
TIPS:
SimpleDateFormat
H:一天中的小时数:0-23
h: am/pm 小时数: 1-12