【无标题】

给定时间区间,按年分割,返回年份和对应的时间区间,处理了边界

测试用例、算法如下,运行 main方法即可

测试结果

在这里插入图片描述

算法代码

 package com.example.demo;

import com.alibaba.fastjson.JSONObject;

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.Month;
import java.util.ArrayList;
import java.util.List;

public class x {
    public static void main(String[] args) {


        LocalDateTime start1 = LocalDateTime.of(2014, 1, 1, 0, 0, 0, 0);
        LocalDateTime end1 = LocalDateTime.of(2014, 12, 31, 23, 59, 59,999999999);
        System.out.println("一年内");
        disResult(splitYear(Timestamp.valueOf(start1), Timestamp.valueOf(end1)));

        //
        LocalDateTime start2 = LocalDateTime.of(2014, 1, 1, 0, 0, 0,0);
        LocalDateTime end2 = LocalDateTime.of(2015, 12, 31, 23, 59, 59,999999999);
        System.out.println("1到2年");
        disResult(splitYear(Timestamp.valueOf(start2), Timestamp.valueOf(end2)));

        LocalDateTime start3 = LocalDateTime.of(2014, 1, 1, 0, 0, 0,0);
        LocalDateTime end3 = LocalDateTime.of(2016, 12, 31, 23, 59, 59,999999999);
        System.out.println("2年以上");
        disResult(splitYear(Timestamp.valueOf(start3), Timestamp.valueOf(end3)));

        LocalDateTime start4 = LocalDateTime.of(2017, 12, 31, 23, 59, 59,999999999);
        LocalDateTime end4 = LocalDateTime.of(2018, 12, 31, 23, 59, 59,999999999);
        System.out.println("边界处理:左");
        disResult(splitYear(Timestamp.valueOf(start4), Timestamp.valueOf(end4)));

        LocalDateTime start5 = LocalDateTime.of(2018, 1, 1, 0, 0, 0,0);
        LocalDateTime end5 = LocalDateTime.of(2019, 1, 1, 0, 0, 0,0);
        System.out.println("边界处理:右");
        disResult(splitYear(Timestamp.valueOf(start5), Timestamp.valueOf(end5)));

        LocalDateTime start6 = LocalDateTime.of(2019, 12, 31, 23, 59, 59,999999999);
        LocalDateTime end6 = LocalDateTime.of(2021, 1, 1, 0, 0, 0,0);
        System.out.println("边界处理:两边");
        disResult(splitYear(Timestamp.valueOf(start6), Timestamp.valueOf(end6)));
    }



    public static JSONObject buildTime(Timestamp start, Timestamp end) {
        JSONObject time = new JSONObject();
        time.put("year", start.toLocalDateTime().getYear());
        time.put("start", start);
        time.put("end", end);
        return time;
    }
    public  static List<JSONObject> splitYear(Timestamp start, Timestamp end) {
        System.out.println( " s:"+start.toLocalDateTime()+"  e :"+end.toLocalDateTime());
        List<JSONObject> list = new ArrayList<>();
        int year = start.toLocalDateTime().getYear();
        Timestamp compare = Timestamp.valueOf(LocalDateTime.of(year, 12, 31, 23, 59, 59,999999999));
        if (compare.compareTo(start) >= 0 && compare.compareTo(end) >= 0) {
            list.add(buildTime(start, end));
            handleSplitResult(list);
            return list;
        }
        Timestamp last = start;//游标
        while (compare.compareTo(end) < 0) {
            Timestamp endTrim = Timestamp.valueOf(LocalDateTime.of(year+1, 1, 1, 0, 0, 0,0));
            if (compare.compareTo(start) > 0 && !endTrim.equals(end)) {
                list.add(buildTime(last, compare));
                last = compare;
            }
            year++;
            compare = Timestamp.valueOf(LocalDateTime.of(year, 12, 31, 23, 59, 59,999999999));
        }
        list.add(buildTime(last, end));
        handleSplitResult(list);
        return list;
    }

    /**
     * 边界处理:左
     * [{"year":2017,"start":"2017-12-31T23:59:59","end":"2018-12-31T23:59:59"}]
     * 边界处理:右
     * [{"year":2018,"start":"2018-01-01T00:00:00","end":"2019-01-01T00:00:00"}]
     * 边界处理:两边
     * [{"year":2019,"start":"2019-12-31T23:59:59","end":"2021-01-01T00:00:00"}]

     * @return
     */
    public  static void   handleSplitResult( List<JSONObject> list){
        for (JSONObject time:list) {
            LocalDateTime s= ((Timestamp)time.getTimestamp("start")).toLocalDateTime();
            LocalDateTime e= ( (Timestamp)time.getTimestamp("end")).toLocalDateTime();
            if(s.getMonth().equals(Month.DECEMBER) && s.getDayOfMonth()==31
                    && s.getHour()==23&&s.getMinute()==59&&s.getSecond()==59 ){
                time.put("start", Timestamp.valueOf(LocalDateTime.of(s.getYear()+1, 1, 1, 0, 0, 0,0)));
                time.put("year", s.getYear()+1);
            }
            if(e.getMonth().equals(Month.JANUARY) && e.getDayOfMonth()==1
                    && e.getHour()==0&&e.getMinute()==0&&e.getSecond()==0 ){
                time.put("end", Timestamp.valueOf(LocalDateTime.of(e.getYear()-1, 12, 31, 23, 59, 59,999999999)));
                time.put("year", e.getYear()-1);
            }
        }
    }

    public  static void disResult( List<JSONObject> list){
        for (JSONObject time:list) {
            LocalDateTime s= ((Timestamp) time.getTimestamp("start")).toLocalDateTime();
            LocalDateTime e= ((Timestamp) time.getTimestamp("end")).toLocalDateTime();
            int y=time.getInteger("year");
            System.out.println(y+"  " +s+ "  "+e);
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值