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

it2026-03-11  1

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; }
最新回复(0)