zoukankan      html  css  js  c++  java
  • 小记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);
    		
    
    	}
    }
    

      

  • 相关阅读:
    Linux stress 命令
    接口安全设计
    2019年MTP管理技能提升培训笔记
    Docker运行图形化程序
    CentOS7搭建本地YUM仓库,并定期同步阿里云源
    搭建私服-docker registry
    linux剪贴板
    如何搭建Docker私有仓库
    彻底解决 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    为人父母始知天下事---“宝宝哭了”的问题来说说什么是分析,什么是设计
  • 原文地址:https://www.cnblogs.com/angusbao/p/10678006.html
Copyright © 2011-2022 走看看