小记Java时间工具类

小记Java时间工具类

  这里主要记录以下几个工具

  • 两个时间只差(Data)
  • 获取时间的格式 格式化时间 返回String
  • 两个时间只差(String)
  • 获取两个时间之间的日期、月份、年份
  • 获取给定日期之前会之后的日期
  • 忽略年月日,仅比较两个时分之间的差 单位分钟  
  • 获取两个时间的间隔天数(忽略了时分秒) 0 则都是当天的 》1 则是跨天  计算收费专用
  • 获取两个时间段内的分段集合 计费专用
  • 判断两个时间区间是否有交集

  以下是代码块,不足之处还望留言指正,万分感谢。

  

package com.ftwj.parking.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

public class DateUtils {

	/**
	 * 两个时间只差
	 * @param startDate
	 * @param endDate
	 * @return 分钟
	 */
	public static Integer getBetweenMinutes(Date startDate, Date endDate) {
		Integer minutes = 0;
		try {
			if(startDate!=null&&endDate!=null) {
				long ss = 0;
				if(startDate.before(endDate)) {
					ss = endDate.getTime() - startDate.getTime();
				}else {
					ss = startDate.getTime() - endDate.getTime();
				}
				minutes = Integer.valueOf((int) (ss/(60*1000))) ;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return minutes;
	}
	/**   
	 * @Title: getDatFormat    获取时间的格式 格式化时间 返回String
	 * @Description:    
	 * @param: @param date 日期 
	 * @param: @param dateFormat 魔板
	 * @param: @return
	 * @throws  包福平      
	 * @return: String       
	 */
	public static String getDatFormat(Date date, String dateFormat) {
		try {
			SimpleDateFormat format = new SimpleDateFormat(dateFormat);
			return format.format(date);
		} catch (Exception e) {
			e.printStackTrace();
			SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-DD");
			return format.format(new Date());
		}
	}
	/**
	 * 两个时间只差
	 * @param startDate
	 * @param endDate
	 * @return 分钟
	 */
	public static Integer getBetweenMinutes(String a, String b) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date startDate;
		Date endDate;
		try {
			startDate = format.parse(a);
			endDate = format.parse(b);
			try {
				long ss = 0;
				if(startDate.before(endDate)) {
					ss = endDate.getTime() - startDate.getTime();
				}else {
					ss = startDate.getTime() - endDate.getTime();
				}
				return Integer.valueOf((int) (ss/(60*1000))) ;
			} catch (Exception e) {
				e.printStackTrace();
				return 0;
			}
		} catch (ParseException e1) {
			e1.printStackTrace();
			return 0;
		}
	}
	
	
	/**
	 * 获取两个时间之间的日期、月份、年份
	 * @param beginDate
	 * @param endDate
	 * @param type{1:日期,2:月份,其他:年份}
	 * @return
	 */
	public static List<String> getBetweenDates(String startDate, String endDate, Integer type) {
		SimpleDateFormat format= null; 
		Date begin = null;
		Date end = null;
		Integer obj = null;
		Integer flag = null;
		if(type!=null&&type==1){
			format = new SimpleDateFormat("yyyy-MM-dd");
			obj = Calendar.DAY_OF_YEAR;
			flag = 9;
		}else if(type!=null&&type==2){
			format = new SimpleDateFormat("yyyy-MM"); 
			obj = Calendar.MONTH;
			flag = 11;
		}else{
			format = new SimpleDateFormat("yyyy");
			obj = Calendar.YEAR;
			flag = 9;
		}
		if(StringUtils.isNotEmpty(startDate)&&StringUtils.isNotEmpty(endDate)){
			try {
				begin = format.parse(startDate);
				end = format.parse(endDate);
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}else{
			end = new Date();
			begin = getDateBefore(end,flag,obj);
		}
		
		List<String> result = new ArrayList<String>();
		Calendar tempStart = Calendar.getInstance();
		tempStart.setTime(begin);
		while (begin.getTime() <= end.getTime()) {
			result.add(format.format(tempStart.getTime()));
			tempStart.add(obj, 1);
			begin = tempStart.getTime();
		}
		return result;
	}
	/**
	 * 获取两个时间之间的日期、月份、年份
	 * @param date{YYYY-MM-DD-YYYY-MM-DD}
	 * @param type{1:日期,2:月份,其他:年份}
	 * @return
	 */
	public static List<String> getBetweenDates(String date,Integer type) {
		SimpleDateFormat format= null; 
		Date begin = null;
		Date end = null;
		Integer obj = null;
		String startDate = null;
		String endDate = null;
		Integer flag = null;
		if(type!=null&&type==1){
			format = new SimpleDateFormat("yyyy-MM-dd");
			obj = Calendar.DAY_OF_YEAR;
			flag = 9;
		}else if(type!=null&&type==2){
			format = new SimpleDateFormat("yyyy-MM"); 
			obj = Calendar.MONTH;
			flag = 11;
		}else{
			format = new SimpleDateFormat("yyyy");
			obj = Calendar.YEAR;
			flag = 9;
		}
		if(StringUtils.isNotEmpty(date)){
			startDate = date.substring(0, 10);
			endDate = date.substring(date.length()-10, date.length());
			try {
				begin = format.parse(startDate);
				end = format.parse(endDate);
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}else{
			end = new Date();
			begin = getDateBefore(end,flag,obj);
		}
		
		List<String> result = new ArrayList<String>();
		Calendar tempStart = Calendar.getInstance();
		tempStart.setTime(begin);
		while (begin.getTime() <= end.getTime()) {
			result.add(format.format(tempStart.getTime()));
			tempStart.add(obj, 1);
			begin = tempStart.getTime();
		}
		return result;
	}

	public static Date getDateBefore(Date d, int day,Integer type) {
		Calendar now = Calendar.getInstance();
		now.setTime(d);
		now.set(type, now.get(type) - day);
		return now.getTime();
	}
	
	/**
	 * 获取给定日期之前会之后的日期
	 * @param date 
	 * @param type
	 * @param num
	 * @return
	 */
	public static String getPreviouslyDate(Date date, String type, Integer num) {
		
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		String resultDate = "";
		Calendar c = Calendar.getInstance();
		c.setTime(date);
        try {
        	switch (type) {
        	case "day":
				c.add(Calendar.DATE, num);
				break;
			case "month":
				c.add(Calendar.MONTH, num);
				break;
			case "year":
				c.add(Calendar.YEAR, num);
				break;
			default:
				c.add(Calendar.DATE, 0);
				break;
			}	
        	Date d = c.getTime();
        	resultDate = format.format(d);
			return resultDate;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**   
	 * @Title: 忽略年月日,仅比较两个时分之间的差 单位分钟   
	 * @Description:    
	 * @param: @param a
	 * @param: @param b
	 * @param: @return
	 * @throws 包福平       
	 * @return: Integer       
	 */
	public static Integer changeYMDtoEqual(Date a,Date b) {
		if(null==a||null==b) {
			return null;
		}
		String ymd=getDatFormat(new Date(), "yyyy-MM-dd");
		String tmpa=ymd+" "+getDatFormat(a, "HH:mm:ss");
		String tmpb=ymd+" "+getDatFormat(b, "HH:mm:ss");
		return getBetweenMinutes(tmpa, tmpb);
	}
	
	
	/**   
	 * @Title: getBetweenDay   获取两个时间的间隔天数(忽略了时分秒) 0 则都是当天的 》1 则是跨天  计算收费专用
	 * @Description:     
	 * @param: @param startTime
	 * @param: @param endTime
	 * @param: @return
	 * @param: @throws ParseException
	 * @throws 包福平       
	 * @return: Integer       
	 */
	public static Integer getBetweenDay(Date startDate,Date endDate) throws ParseException {
//		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        //跨年的情况会出现问题哦
        //如果时间为:2016-03-18 11:59:59 和 2016-03-19 00:00:01的话差值为 1
        Calendar aCalendar = Calendar.getInstance();
        aCalendar.setTime(startDate);
        int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);
        aCalendar.setTime(endDate);
        int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);
        int days=day2-day1;
		return days;
	}
	
	/**   
	 * @Title: getDayDetailsBetweenDates   
	 * @Description:  获取两个时间段内的分段集合 计费专用
	 * 例子:  String startTime="2019-01-12 7:30:33";
			String endTime="2019-01-14 7:30:34";
		结果
		2019-01-12 07:30:33----2019-01-13 00:00:00
		2019-01-13 00:00:00----2019-01-14 00:00:00
		2019-01-14 00:00:00----2019-01-14 07:30:34
	 * @param: @param startDate
	 * @param: @param endDate
	 * @param: @return
	 * @param: @throws ParseException
	 * @throws 包福平       
	 * @return: List<Map<String,Date>>       
	 */
	public static List<Map<String,Date>> getDayDetailsBetweenDates(Date startDate,Date endDate) throws ParseException{
		Integer days=getBetweenDay(startDate, endDate);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		List<Map<String,Date>> list= new ArrayList<Map<String,Date>>();
		for (int i = 0; i <= days; i++) {
			System.out.println(i);
			Map<String,Date>  map = new HashMap<String,Date>();
			if(i==0) {
				map.put("start", startDate);
			}else {
				map.put("start", sdf.parse(getPreviouslyDate(startDate, "day", i)+" 00:00:00"));
			}
			if(i==days) {
				map.put("end", endDate);
			}else {
				map.put("end", sdf.parse(getPreviouslyDate(startDate, "day", i+1)+" 00:00:00"));
			}
			list.add(map);
		}
		return list;
		
	}
	
	
	/**   
	 * @Title: getIntersectionDate   先进行排序,然后去中间的两个Date 判断此两端分钟数是否相等 不等则取到这个的交集
	 * @Description: 判断两个时间区间是否有交集  有 则返回交集部分 无则null   网上的一坨屎,自己写吧 
	 * @param: @param bt 开始1
	 * @param: @param ot 结束1 
	 * @param: @param st 开始2
	 * @param: @param ed 结束2 
	 * @param: @return
	 * @throws 包福平       
	 * @return: List<Date>       
	 */
	public static List<Date> getIntersectionDate(Date bt,Date ot,Date st,Date ed) {
		try {
			//去除直接没有任何交集的部分
			if(bt.after(ed)||ot.before(st)) {
				return null;
			}
			List<Date> returnList = new ArrayList<Date>();
			List<Date> list = new ArrayList<Date>();
			list.add(bt);
			list.add(ot);
			list.add(st);
			list.add(ed);
			Collections.sort(list);
			if(list.get(1).compareTo(list.get(2))!=0&&(bt.before(ed))) {
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				System.out.println("包含的开始时间是:" + sdf.format(list.get(1)) + "-结束时间是:" + sdf.format(list.get(2)));
				returnList.add(list.get(1));
				returnList.add(list.get(2));
			}
			return returnList;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	
	public static void main(String[] args) throws ParseException{
//		String startTime="2019-01-12 7:30:33";
//		String endTime="2019-01-14 7:30:34";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//		Date startDate=sdf.parse(startTime);
//		Date endDate=sdf.parse(endTime);
//		List<Map<String,Date>> list= getDayDetailsBetweenDates(startDate, endDate);
//		
//		for (Map<String, Date> map : list) {
//			System.out.println(sdf.format(map.get("start"))+"----"+sdf.format(map.get("end")));
//		}
		
//		// 标准时间
		Date startTime = sdf.parse("2019-01-13 00:00:00");//startTime 
		Date endTime = sdf.parse("2019-01-14 00:00:00");//endTime 
		// 目标时间
		Date start = sdf.parse("2019-01-13 07:30:00");//start
		Date end = sdf.parse("2019-01-13 10:00:00");//end
		getIntersectionDate(startTime, endTime, start, end);
		

	}
}

  

 

posted @ 2019-04-09 16:52  流年煮雪  阅读(297)  评论(6编辑  收藏  举报