对日期的各种操作

前排提醒:若使用

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


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值