某时间段生成自然周、月、季度或固定周、月、季度(初级写法,个人笔记)

这段代码展示了如何在Java中计算两个日期之间的自然周、月和季度,以及如何按固定周期(周、月、季度)进行时间划分。主要方法包括`naturalPeriod`用于获取自然周期,`period`、`month`和`quarter`分别处理自然周、月和季度的计算,而`fixationPeriod`则用于计算固定周期的时间段。
摘要由CSDN通过智能技术生成

1、自然周、月、季度

1.1、调用自然周 、月、季度 方法
import java.text.SimpleDateFormat;
import java.util.*;
/**
  * 自然周期
  * @param start_time
  * @param end_time
  * @param period  周期  1:周  2:月  3:季度
  * @return
  */
 private Map<String,Object> naturalPeriod(Date start_time,Date end_time,String period){
     SimpleDateFormat sdf_s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     //开始时间从零点开始
     long start_m = 0;
     long end_m = 0;
     try {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         start_m = sdf_s.parse(sdf.format(start_time)+" 00:00:00").getTime();
         //结束时间到23:59:59
         end_m = sdf_s.parse(sdf.format(end_time)+" 00:00:00").getTime();
     } catch (ParseException e) {
         logger.error("时间转换异常=={}",e.getMessage());
         start_m = new Date().getTime();
         end_m = new Date().getTime();
     }
     Map<String,Object> result = new HashMap<String, Object>();
     //开始时间小于结束时间
     if(end_m - start_m < 0){
         result.put("state",false);
         return result;
     }
     List<Map<String,Date>> list = new ArrayList<Map<String, Date>>();
     if("1".equals(period)){
         //自然周
         list.addAll(this.period(start_m, end_m));

     }else if("2".equals(period)){
         //自然月
         list.addAll(this.month(start_m, end_m));
     }else if("3".equals(period)){
         //自然季度
         list.addAll(this.quarter(start_m, end_m));
     }
     result.put("state",true);
     result.put("date",list);
     return result;
 }
1.2、自然周
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * 两时间段的自然周  开始时间与结束时间均从零点开始
 * @param start_m
 * @param end_m
 * @return
 */
private List<Map<String,Date>> period(long start_m,long end_m){
    List<Map<String,Date>> list = new ArrayList<Map<String, Date>>();
    Date start_date = new Date();
    Date end_date = new Date();
    //开始时间与结束时间相同
    if(end_m == start_m){
        Map<String,Date> w_map = new HashMap<String, Date>();
        start_date = new Date();
        end_date = new Date();
        start_date.setTime(start_m);
        w_map.put("start_time",start_date);
        end_date.setTime(end_m);
        w_map.put("end_time",end_date);
        list.add(w_map);
        return list;
    }


    long one_day = 24*60*60*1000;

    //获取开始时间的结束周
    Calendar start = Calendar.getInstance(); // 获得一个日历
    start.setTimeInMillis(start_m);
    int start_w = start.get(Calendar.DAY_OF_WEEK); // 指示一个星期中的某天。
    long start_end_w = 0;
    if(start_w == 1){
        start_end_w = start_m;
    }else if(start_w == 2){
        start_end_w = start_m + (6*one_day);
    }else if(start_w == 3){
        start_end_w = start_m + (5*one_day);
    }else if(start_w == 4){
        start_end_w = start_m + (4*one_day);
    }else if(start_w == 5){
        start_end_w = start_m + (3*one_day);
    }else if(start_w == 6){
        start_end_w = start_m + (2*one_day);
    }else if(start_w == 7){
        start_end_w = start_m + one_day;
    }

    //开始时间的结束周与结束时间相同
    Map<String,Date> start_w_map = new HashMap<String, Date>();
    start_date = new Date();
    end_date = new Date();
    if(start_end_w == end_m){
        start_date.setTime(start_m);
        start_w_map.put("start_time",start_date);
        end_date.setTime(start_end_w);
        start_w_map.put("end_time",end_date);
        list.add(start_w_map);
        return list;
    }else if(start_end_w > end_m){
        start_date.setTime(start_m);
        start_w_map.put("start_time",start_date);
        end_date.setTime(end_m);
        start_w_map.put("end_time",end_date);
        list.add(start_w_map);
        return list;
    }else {
        start_date.setTime(start_m);
        start_w_map.put("start_time", start_date);
        end_date.setTime(start_end_w);
        start_w_map.put("end_time", end_date);
        list.add(start_w_map);
    }

    //获取结束时间的开始周
    Calendar end = Calendar.getInstance(); // 获得一个日历
    end.setTimeInMillis(end_m);
    int end_w = end.get(Calendar.DAY_OF_WEEK); // 指示一个星期中的某天。
    long end_start_w = 0;
    if(end_w == 1){
        end_start_w = end_m - (6*one_day);
    }else if(end_w == 2){
        end_start_w = end_m;
    }else if(end_w == 3){
        end_start_w = end_m - (one_day);
    }else if(end_w == 4){
        end_start_w = end_m - (2*one_day);
    }else if(end_w == 5){
        end_start_w = end_m - (3*one_day);
    }else if(end_w == 6){
        end_start_w = end_m - (4*one_day);
    }else if(end_w == 7){
        end_start_w = end_m - (5*one_day);
    }
    //计算中间的时间    开始周和结束周不相同
    if(end_start_w-start_end_w+one_day > 0 ){
        long day = 0;
        if((end_start_w-one_day-start_end_w)%one_day == 0){
            day = (end_start_w-one_day-start_end_w)/one_day;
        }else{
            day = (end_start_w-one_day-start_end_w)/one_day+1;
        }
        long period_day = day/7;
        long s_time = 0;
        long next_time = 0;
        for(long i = 0;i<period_day;i++){
            Map<String,Date> map = new HashMap<String, Date>();
            if(i == 0){
                //第一次的开始时间
                s_time = start_end_w+one_day;
            }else{
                //以后次数的开始时间
                s_time = next_time + one_day;
            }
            next_time = s_time + (6*one_day);
            if(i == period_day -1){
                next_time = end_start_w-one_day;
            }
            start_date = new Date();
            end_date = new Date();
            start_date.setTime(s_time);
            map.put("start_time",start_date);
            end_date.setTime(next_time);
            map.put("end_time",end_date);
            list.add(map);
        }

    }
    Map<String,Date> end_w_map = new HashMap<String, Date>();
    start_date = new Date();
    end_date = new Date();
    start_date.setTime(end_start_w);
    end_w_map.put("start_time",start_date);
    end_date.setTime(end_m);
    end_w_map.put("end_time",end_date);
    list.add(end_w_map);
    return list;
}
1.3、自然月
/**
 * 两时间段的自然月  开始时间与结束时间均从零点开始
 * @param start_m
 * @param end_m
 * @return
 */
private List<Map<String,Date>> month(long start_m,long end_m){
    List<Map<String,Date>> list = new ArrayList<Map<String, Date>>();
    Date start_date;
    Date end_date;
    Map<String,Date> m_map ;

    long one_day = 24*60*60*1000;
    //获取两个时间段的月
    Calendar c_start = Calendar.getInstance(); // 获得一个日历
    c_start.setTimeInMillis(start_m);

    Calendar c_end = Calendar.getInstance(); // 获得一个日历
    c_end.setTimeInMillis(end_m);
    //计算间隔多少月
    int result = c_end.get(Calendar.MONTH) - c_start.get(Calendar.MONTH);
    int month = (c_end.get(Calendar.YEAR) - c_start.get(Calendar.YEAR)) * 12;
    int abs = Math.abs(month + result);
    //开始月和结束月不相同
    if(abs == 0 ){
        m_map = new HashMap<String, Date>();
        start_date = new Date();
        end_date = new Date();
        start_date.setTime(start_m);
        m_map.put("start_time",start_date);
        end_date.setTime(end_m);
        m_map.put("end_time",end_date);
        list.add(m_map);
        return list;

    }


    long max_day_m = 0;
    for(int i = 0;i<=abs;i++){
        m_map = new HashMap<String, Date>();
        start_date = new Date();
        end_date = new Date();
        long day_m = 0;
        //开始时间
        if(i == 0){
            start_date.setTime(start_m);
            m_map.put("start_time", start_date);
            day_m = start_m;
        } else{
            day_m = max_day_m + one_day;
            start_date.setTime(day_m);
            m_map.put("start_time", start_date);
        }
        //结束时间
        if(i == abs){
            end_date.setTime(end_m);
            m_map.put("end_time",end_date);
        }else {
            Calendar next_end = Calendar.getInstance();
            next_end.setTimeInMillis(day_m);
            next_end.set(Calendar.DAY_OF_MONTH, next_end.getActualMaximum(Calendar.DAY_OF_MONTH));
            max_day_m = next_end.getTime().getTime();
            end_date.setTime(max_day_m);
            m_map.put("end_time",end_date);
        }
        list.add(m_map);
    }

    return list;
}
1.4、自然季度
/**
 * 两个时间段的自然季度
 * @param start_m
 * @param end_m
 * @return
 */
private List<Map<String,Date>> quarter(long start_m,long end_m){
    List<Map<String,Date>> list = new ArrayList<Map<String, Date>>();
    Date start_date;
    Date end_date;
    Map<String,Date> q_map ;

    long one_day = 24*60*60*1000;
    //开始时间的结束季度时间
    long startQuarterStartTime = this.getQuarterStartTime(start_m);
    long startQuarterEndTime = this.getQuarterEndTime(start_m);
    //结束时间的开始季度时间
    long endQuarterStartTime = this.getQuarterStartTime(end_m);
    long endQuarterEndTime = this.getQuarterEndTime(end_m);
    //判断两个时间是否在同一个季度中
    if(startQuarterStartTime == endQuarterStartTime && startQuarterEndTime == endQuarterEndTime){
        q_map = new HashMap<String, Date>();
        start_date = new Date();
        end_date = new Date();
        start_date.setTime(start_m);
        q_map.put("start_time",start_date);
        end_date.setTime(end_m);
        q_map.put("end_time",end_date);
        list.add(q_map);
        return list;
    }
    //获取开始时间的结束季度的月
    Calendar c_start = Calendar.getInstance(); // 获得一个日历
    c_start.setTimeInMillis(startQuarterEndTime);
    //获取结束时间的结束季度的月
    Calendar c_end = Calendar.getInstance(); // 获得一个日历
    c_end.setTimeInMillis(endQuarterStartTime);
    //计算间隔多少月
    int result = c_end.get(Calendar.MONTH) - c_start.get(Calendar.MONTH);
    int month = (c_end.get(Calendar.YEAR) - c_start.get(Calendar.YEAR)) * 12;
    int abs = Math.abs(month + result);
    if(abs%3==0){
        abs = abs/3;
    }else{
        abs = abs/3+1;
    }

    long nextQuarterStart = 0;

    for(int i = 0;i<=abs;i++){
        q_map = new HashMap<String, Date>();
        if(i == 0){
            start_date = new Date();
            end_date = new Date();
            start_date.setTime(start_m);
            q_map.put("start_time",start_date);
            end_date.setTime(startQuarterEndTime);
            q_map.put("end_time",end_date);
            list.add(q_map);

            nextQuarterStart = startQuarterEndTime+one_day;

        }else if(i == abs){
            start_date = new Date();
            end_date = new Date();
            start_date.setTime(endQuarterStartTime);
            q_map.put("start_time",start_date);
            end_date.setTime(end_m);
            q_map.put("end_time",end_date);
            list.add(q_map);
        }else{
            start_date = new Date();
            end_date = new Date();
            start_date.setTime(nextQuarterStart);
            q_map.put("start_time",start_date);

            //下一个季度的结束时间
            long nextQuarterEndTime = this.getQuarterEndTime(nextQuarterStart);
            end_date.setTime(nextQuarterEndTime);
            q_map.put("end_time",end_date);
            list.add(q_map);
            nextQuarterStart = nextQuarterEndTime + one_day;
        }
    }

    return list;
}
/**
 * 季度的开始时间
 *
 * @return
 */
public long getQuarterStartTime(long time) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Calendar c = Calendar.getInstance();
    c.setTimeInMillis(time);
    int currentMonth = c.get(Calendar.MONTH) + 1;
    Date now = null;
    try {
        if (currentMonth >= 1 && currentMonth <= 3) {
            c.set(Calendar.MONTH, 0);
        }else if (currentMonth >= 4 && currentMonth <= 6){
            c.set(Calendar.MONTH, 3);
        }else if (currentMonth >= 7 && currentMonth <= 9){
            c.set(Calendar.MONTH, 6);
}       else if (currentMonth >= 10 && currentMonth <= 12) {
            c.set(Calendar.MONTH, 9);
        }
        c.set(Calendar.DATE, 1);
        now = sdf1.parse(sdf.format(c.getTime()) + " 00:00:00");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return now.getTime();
}

/**
 * 季度的结束时间
 *
 * @return
 * @param start_m
 */
public long getQuarterEndTime(long start_m) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Calendar c = Calendar.getInstance();
    c.setTimeInMillis(start_m);
    int currentMonth = c.get(Calendar.MONTH) + 1;
    Date now = null;
    try {
        if (currentMonth >= 1 && currentMonth <= 3) {
            c.set(Calendar.MONTH, 2);
        } else if (currentMonth >= 4 && currentMonth <= 6) {
            c.set(Calendar.MONTH, 5);
        } else if (currentMonth >= 7 && currentMonth <= 9) {
            c.set(Calendar.MONTH, 8);
        } else if (currentMonth >= 10 && currentMonth <= 12) {
            c.set(Calendar.MONTH, 11);
        }
        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
        now = sdf1.parse(sdf.format(c.getTime()) + " 00:00:00");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return now.getTime();
}

2、固定周、月、季度

/**
 * 计算固定周期得时间
 * @param start_time
 * @param end_time
 * @param period  1:周,2:月,3:季度
 */
private Map<String,Object> fixationPeriod(Date start_time,Date end_time,String period){
    Map<String,Object> result = new HashMap<String, Object>();
    SimpleDateFormat sdf_s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    //开始时间从零点开始
    long one_day = 24*60*60*1000;
    long start = 0;
    long end = 0;
    try {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        start = sdf_s.parse(sdf.format(start_time)+" 00:00:00").getTime();
        //结束时间到23:59:59
        end = sdf_s.parse(sdf.format(end_time)+" 00:00:00").getTime();
    } catch (ParseException e) {
        logger.error("时间转换异常=={}",e.getMessage());
        start = new Date().getTime();
        end = new Date().getTime();
    }
    //计算一共有多少天
    long day = 0;
    if((end - start)%one_day == 0){
        day = (end - start)/one_day;
    }else{
        day = (end - start)/one_day+1;
    }

    List<Map<String,Date>> list = new ArrayList<Map<String, Date>>();
    long period_day = 0;
    long interval_day = 0;
    //根据周期计算间隔
    if("1".equals(period)){
        interval_day = 6;
        //周
        if(day < 7){
            result.put("status",false);
            return result;
        }
        if(day%7==0){
            period_day = day/7;
        }else{
            period_day = day/7 +1 ;
        }
    }else if("2".equals(period)){
        interval_day = 29;
        //月
        if(day >= 30){
            if(day%30==0){
                period_day = day/30;
            }else{
                period_day = day/30 +1 ;
            }
        }

    }else if("3".equals(period)){
        interval_day = 89;
        //季度
        if(day >= 90){
            if(day%90==0){
                period_day = day/90;
            }else{
                period_day = day/90 +1 ;
            }
        }

    }
    long s_time = 0;
    long next_time = 0;
    for(long i = 0;i<period_day;i++){
        Map<String,Date> map = new HashMap<String, Date>();
        if(i == 0){
            //第一次的开始时间
            s_time = start;
        }else{
            //以后次数的开始时间
            s_time = next_time + one_day;
        }
        next_time = s_time + (interval_day*one_day);
        if(i == period_day -1){
            next_time = end;
        }
        Date sd = new Date();
        sd.setTime(s_time);
        map.put("start_time",sd);
        Date ed = new Date();
        ed.setTime(next_time);
        map.put("end_time",ed);
        list.add(map);
    }
    result.put("state",true);
    result.put("date",list);
    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值