Java 对时间进行年、月、天、季度分割

package com.jt.test.tools;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import com.alibaba.druid.util.StringUtils;

public class TimeCutUtil {

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    private static SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
    
	public static void main(String[] args) {
		String stTime = "2021-12-01 00:00:00";
		String edTime = "2021-12-31 23:59:59";
		Long startTime = dateToStamp(stTime);
		Long endTime = dateToStamp(edTime);
	    // 3.开始时间段区间集合
	    List<Long> beginDateList = new ArrayList<Long>();
	    // 4.结束时间段区间集合
	    List<Long> endDateList = new ArrayList<Long>();
	    // 5.调用工具类
	    String hours = "23";
	    if(StringUtils.isEmpty(hours) || "0".equals(hours)) {
	    	TimeCutUtil.getIntervalTimeByDay(startTime, endTime, beginDateList, endDateList);
	    }else {
		    Integer stHour = Integer.valueOf(hours);
			Integer edHour = (stHour == 0 ? 24 : stHour) - 1;
		    TimeCutUtil.getIntervalTimeByDay2(startTime, endTime, beginDateList, endDateList, stHour, edHour);
		}
//	    System.out.println(beginDateList);
//	    System.out.println(endDateList);
	    //TimeCutUtil.getIntervalTimeByWeek(startTime, endTime, beginDateList, endDateList);
	    // 6.打印输出
	    for (int i = 0; i < beginDateList.size(); i++) {
	        Long beginStr = beginDateList.get(i);
	        Long endStr = endDateList.get(i);
	        String begin1 = sdf.format(new Date(beginStr));
	        String end1 = sdf.format(new Date(endStr));
	        System.out.println("该时间段内第" + (i+1) + "月--时间区间:" + begin1 + "-------" + end1);
	    }
	}
	
	/*
	 * 将时间转换为时间戳
	 */
	public static Long dateToStamp(String s) {
		try {
			Date date = sdf.parse(s);
			long ts = date.getTime();
			return ts;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
    * 以季度分割时间段
    * 此处季度是以 1-3月   4-6月   7-9月  10-12月 划分  
    * @param startTime     开始时间戳(毫秒)
    * @param endTime       结束时间戳(毫秒)
    * @param beginDateList 开始段时间戳 和 结束段时间戳 一一对应
    * @param endDateList   结束段时间戳 和 开始段时间戳 一一对应
    */
    public static void getIntervalTimeByQuarter(Long startTime, Long endTime, List<Long> beginDateList, List<Long> endDateList) {
        Date startDate = new Date(startTime);
        Date endDate = new Date(endTime);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(startDate);
        int month = calendar.get(Calendar.MONTH) + 1;
        switch (month) {
            case 12:
            case 3:
            case 6:
            case 9:
                addTime(beginDateList, endDateList, startDate, endDate, calendar, 1);
                break;
            case 1:
            case 4:
            case 7:
            case 10:
                addTime(beginDateList, endDateList, startDate, endDate, calendar, 3);
                break;
            case 2:
            case 5:
            case 8:
            case 11:
                addTime(beginDateList, endDateList, startDate, endDate, calendar, 2);
                break;
        }
    }

    private static void addTime(List<Long> beginDateList, List<Long> endDateList, Date startDate, Date endDate, Calendar calendar, int i) {
        beginDateList.add(startDate.getTime());
        calendar.add(Calendar.MONTH, i);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.add(Calendar.DATE, -1);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        if (calendar.getTimeInMillis() > endDate.getTime()) {
            endDateList.add(endDate.getTime());
        } else {
            endDateList.add(calendar.getTimeInMillis());
            while (calendar.getTimeInMillis() < endDate.getTime()) {
                calendar.add(Calendar.DATE, 1);
                calendar.set(Calendar.HOUR_OF_DAY, 0);
                calendar.set(Calendar.MINUTE, 0);
                calendar.set(Calendar.SECOND, 0);
                beginDateList.add(calendar.getTimeInMillis());
                calendar.add(Calendar.MONTH, 3);
                calendar.set(Calendar.DAY_OF_MONTH, 1);
                calendar.add(Calendar.DATE, -1);
                calendar.set(Calendar.HOUR_OF_DAY, 23);
                calendar.set(Calendar.MINUTE, 59);
                calendar.set(Calendar.SECOND, 59);
                if (calendar.getTimeInMillis() < endDate.getTime()) {
                    endDateList.add(calendar.getTimeInMillis());
                } else {
                    endDateList.add(endDate.getTime());
                }
            }
        }
    }
    
    /**
     * 以周分割时间段
     *
     * @param startTime     开始时间戳(毫秒)
     * @param endTime       结束时间戳(毫秒)
     * @param beginDateList 开始段时间戳 和 结束段时间戳 一一对应
     * @param endDateList   结束段时间戳 和 开始段时间戳 一一对应
     */
     public static void getIntervalTimeByWeek(Long startTime, Long endTime, List<Long> beginDateList, List<Long> endDateList) {
     	try {
     		Date startDate = new Date(startTime);
 			Calendar calendar  = Calendar.getInstance();
 			calendar.setFirstDayOfWeek(Calendar.MONDAY);
 			calendar.setTime(startDate);
 			boolean bool = true;
 			while (calendar.getTimeInMillis() <= endTime) {
 				int week1 = calendar.get(Calendar.DAY_OF_WEEK) - 1;// 周几
 				if (bool || week1 == 0 || week1 == 1) {
 					if (week1 == 0) {// 周日
 						calendar.set(Calendar.HOUR_OF_DAY, 23);
 						calendar.set(Calendar.MINUTE, 59);
 						calendar.set(Calendar.SECOND, 59);
 		                endDateList.add(calendar.getTimeInMillis());
 					} else {
 						calendar.set(Calendar.HOUR_OF_DAY, 0);
 						calendar.set(Calendar.MINUTE, 0);
 						calendar.set(Calendar.SECOND, 0);
 						beginDateList.add(calendar.getTimeInMillis());
 					}
 					bool = false;
 				}
 				calendar.add(Calendar.DAY_OF_MONTH, 1);// 加一天
 			}
 			endDateList.add(endTime);
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
   }

    /**
    * 按照月份分割一段时间
    *
    * @param startTime     开始时间戳(毫秒)
    * @param endTime       结束时间戳(毫秒)
    * @param beginDateList 开始段时间戳 和 结束段时间戳 一一对应
    * @param endDateList   结束段时间戳 和 开始段时间戳 一一对应
    */
    public static void getIntervalTimeByMonth(Long startTime, Long endTime, List<Long> beginDateList, List<Long> endDateList) {
        Date startDate = new Date(startTime);
        Date endDate = new Date(endTime);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(startDate);
        beginDateList.add(calendar.getTimeInMillis());
        while (calendar.getTimeInMillis() < endDate.getTime()) {
            calendar.add(Calendar.MONTH, 1);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            calendar.add(Calendar.DATE, -1);
            calendar.set(Calendar.HOUR_OF_DAY, 23);
            calendar.set(Calendar.MINUTE, 59);
            calendar.set(Calendar.SECOND, 59);
            if(calendar.getTimeInMillis() < endDate.getTime()){
                endDateList.add(calendar.getTimeInMillis());
            } else {
                endDateList.add(endDate.getTime());
                break;
            }
            calendar.add(Calendar.DATE, 1);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            beginDateList.add(calendar.getTimeInMillis());
        }
    }
    
    /**
     * 按照天分割一段时间
     *
     * @param startTime     开始时间戳(毫秒)
     * @param endTime       结束时间戳(毫秒)
     * @param beginDateList 开始段时间戳 和 结束段时间戳 一一对应
     * @param endDateList   结束段时间戳 和 开始段时间戳 一一对应
     */
    public static void getIntervalTimeByDay(Long startTime, Long endTime, List<Long> beginDateList, List<Long> endDateList) {
		 Date startDate = new Date(startTime);
	     Date endDate = new Date(endTime);
	     Calendar calendar = Calendar.getInstance();
	     calendar.setTime(startDate);
	     beginDateList.add(calendar.getTimeInMillis());
	     while (calendar.getTimeInMillis() < endDate.getTime()) {
	         calendar.set(Calendar.HOUR_OF_DAY, 23);
	         calendar.set(Calendar.MINUTE, 59);
	         calendar.set(Calendar.SECOND, 59);
	         if(calendar.getTimeInMillis() < endDate.getTime()){
	             endDateList.add(calendar.getTimeInMillis());
	         } else {
	             endDateList.add(endDate.getTime());
	             break;
	         }
	         calendar.add(Calendar.DATE, 1);
	         calendar.set(Calendar.HOUR_OF_DAY, 0);
	         calendar.set(Calendar.MINUTE, 0);
	         calendar.set(Calendar.SECOND, 0);
	         beginDateList.add(calendar.getTimeInMillis());
	     }
    }
    
    /**
     * 按照天分割一段时间
     *
     * @param startTime     开始时间戳(毫秒)
     * @param endTime       结束时间戳(毫秒)
     * @param beginDateList 开始段时间戳 和 结束段时间戳 一一对应
     * @param endDateList   结束段时间戳 和 开始段时间戳 一一对应
     */
    public static void getIntervalTimeByDay2(Long startTime, Long endTime, List<Long> beginDateList, List<Long> endDateList, int stHour, int edHour) {
		 Date startDate = new Date(startTime);
	     Date endDate = new Date(endTime);
	     Calendar calendar = Calendar.getInstance();
	     calendar.setTime(startDate);
	     beginDateList.add(calendar.getTimeInMillis());
	     int i = 0;
	     while (calendar.getTimeInMillis() < endDate.getTime()) {
	    	 if(i != 0 && stHour != 0) {
		         calendar.add(Calendar.DATE, 1);
	    	 }
	         calendar.set(Calendar.HOUR_OF_DAY, edHour);
	         calendar.set(Calendar.MINUTE, 59);
	         calendar.set(Calendar.SECOND, 59);
	         if(calendar.getTimeInMillis() < endDate.getTime()){
	             endDateList.add(calendar.getTimeInMillis());
	         } else {
	             endDateList.add(endDate.getTime());
	             break;
	         }
	         calendar.set(Calendar.HOUR_OF_DAY, stHour);
	         calendar.set(Calendar.MINUTE, 0);
	         calendar.set(Calendar.SECOND, 0);
	         beginDateList.add(calendar.getTimeInMillis());
	         i++;
	     }
    }
    
    /**
     * 获取指定年月的第一天
     * @param date
     * @return
     */
    public static String getFirstDayOfMonth(String date) {    
    	String[] split = date.split("-");
        Calendar cal = Calendar.getInstance();   
        //设置年份
        cal.set(Calendar.YEAR, Integer.valueOf(split[0]));
        //设置月份 
        cal.set(Calendar.MONTH, Integer.valueOf(split[1]) - 1); 
        //获取某月最小天数
        int firstDay = cal.getMinimum(Calendar.DATE);
        //设置日历中月份的最小天数 
        cal.set(Calendar.DAY_OF_MONTH,firstDay);
        
        return sdf2.format(cal.getTime());  
    }
    
    /**
     * 获取指定年月的最后一天
     * @param date
     * @return
     */
     public static String getLastDayOfMonth(String date) {  
    	 String[] split = date.split("-");
         Calendar cal = Calendar.getInstance();     
         //设置年份  
         cal.set(Calendar.YEAR, Integer.valueOf(split[0]));
         //设置月份 
         cal.set(Calendar.MONTH, Integer.valueOf(split[1]) - 1); 
         //获取某月最大天数
         int lastDay = cal.getActualMaximum(Calendar.DATE);
         //设置日历中月份的最大天数  
         cal.set(Calendar.DAY_OF_MONTH, lastDay);
         
         return sdf2.format(cal.getTime());
     }
}

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值