小记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的话差值为 1Calendar 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:002019-01-13 00:00:00----2019-01-14 00:00:002019-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");//startDate end = sdf.parse("2019-01-13 10:00:00");//endgetIntersectionDate(startTime, endTime, start, end);}
}