常用的日期相关的工具类

public class DateUtil {
	
	public static SimpleDateFormat YYYY = new SimpleDateFormat("yyyy");
	public static String YYYY_MM_DD_STR = "yyyy-MM-dd";
	public static SimpleDateFormat YYYY_MM_DD = new SimpleDateFormat(YYYY_MM_DD_STR);
	public static SimpleDateFormat YYYY_MM_DD_HH_mm = new SimpleDateFormat("yyyy-MM-dd HH:mm");
	public static String YYYY_MM_DD_HH_mm_ss_STR = "yyyy-MM-dd HH:mm:ss";
	public static SimpleDateFormat YYYY_MM_DD_HH_mm_ss = new SimpleDateFormat(YYYY_MM_DD_HH_mm_ss_STR);
	public static SimpleDateFormat YYYTMMDD = new SimpleDateFormat("yyyyMMdd");
	public static SimpleDateFormat YYYTMM = new SimpleDateFormat("yyyy-MM");
	public static SimpleDateFormat YYYYMM = new SimpleDateFormat("yyyyMM");
	public static SimpleDateFormat HH_mm_ss = new SimpleDateFormat("HH:mm:ss");
	public static SimpleDateFormat YYYY_MM = new SimpleDateFormat("yyyy-MM");
	public static SimpleDateFormat HH_mm = new SimpleDateFormat("HH:mm");
	public static SimpleDateFormat HH = new SimpleDateFormat("HH");
	public static SimpleDateFormat mm = new SimpleDateFormat("mm");
	public static SimpleDateFormat MMXDD = new SimpleDateFormat("MM/DD");
	public static SimpleDateFormat YYMMDD = new SimpleDateFormat("yyMMdd");

	/**
	 * 根据传入的日期字符串获取指定类型的日期对象
	 * @param date 传入的日期
	 * @return
	 */
	public static Date getDateByString(String date){
		if (StringUtils.isBlank(date)){
			return null;
		}
		try{
			return YYYY_MM_DD_HH_mm_ss.parse(date);
		}catch(Exception e){
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 根据月份得出该月的天数
	 * @param date
	 * @return
	 */
	public static int getDayNumsOfMonth(String date){
		Date dat = DateFormat.getDateByString(date, "yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.setTime(dat);
		int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
		return maxDay;		
	}
    /**
     * 获取指定年月的最后一天的日期字符串
     * @param yearMonth 2020-01
     * @return  2020-01-31
     */
    public static String getLastDayOfMonth(String yearMonth) {
        // 格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        int year = Integer.parseInt(yearMonth.split("-")[0]);  //年
        int month = Integer.parseInt(yearMonth.split("-")[1]); //月
        Calendar cal = Calendar.getInstance();
        // 设置年份
        cal.set(Calendar.YEAR, year);
        // 设置月份
        cal.set(Calendar.MONTH, month); //设置当前月的下一个月
        // 获取某月最大天数
        int lastDay = cal.getMinimum(Calendar.DATE); //获取月份中的最小值,即第一天
        // 设置日历中月份的最大天数
        cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //下月的第一天减去1就是当月的最后一天
        return sdf.format(cal.getTime());
    }

	/**
	 * 获取去年同月
	 * @param date
	 * @return
	 */
	public static String getLastYearMonth(String date){
		Date dat = DateFormat.getDateByString(date, "yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.setTime(dat);
		int year = cal.get(Calendar.YEAR)-1;
		int month = cal.get(Calendar.MONTH)+1;
		return year+"-"+(month<10?"0"+month:month);
	}
	/**
	 * 获取去年同期
	 * @param date
	 * @return
	 */
	public static String getLastYearDate(String date){
		Date dat = DateFormat.getDateByString(date, "yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.setTime(dat);
		int year = cal.get(Calendar.YEAR)-1;
		int month = cal.get(Calendar.MONTH)+1;
		int days = cal.get(Calendar.DATE);
		return year+"-"+(month<10?"0"+month:month)+"-"+(days<10?"0"+days:days);
	}
	/**
	 * 获取上月
	 * @param date
	 * @return
	 */
	public static String getLastMonth(String date){
		Date dat = DateFormat.getDateByString(date, "yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.setTime(dat);
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH);
		if(month == 0) {
			year = year -1;
			month = 12;
		}
		return year+"-"+(month<10?"0"+month:month);
	}
	/**
	 * 传入时间加减时间的算法
	 * @param date
	 * @param param 1:年;2:月;3:日;4:小时;:5:分钟;6:秒
	 * @param numbers 整数:加上 负数:减去
	 * @return
	 */
	public static Date getDateByAddOrMinus(Date date,int param,int numbers){
		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.setTime(date);
		switch(param){
		case 1 : cal.add(Calendar.YEAR,numbers); break;//日期减去/加上**年
		case 2 : cal.add(Calendar.MONTH,numbers); break;//日期减去/加上**月
		case 3 : cal.add(Calendar.DATE,numbers); break;//日期减去/加上**日
		case 4 : cal.add(Calendar.HOUR,numbers); break;//日期减去/加上**小时
		case 5 : cal.add(Calendar.MINUTE,numbers); break;//日期减去/加上**分钟
		case 6 : cal.add(Calendar.SECOND,numbers); break;//日期减去/加上**秒
		default : break;
		}
		return cal.getTime();
	}
	
	/**
	 * 月初xxxx-yy-zz (eg: 2007-12-31)
	 * 
	 * @return String
	 * @author pure
	 **/
	public static String getMonthStart(String today) {

		Calendar localTime = Calendar.getInstance();
		try {
			localTime.setTime(YYYTMM.parse(today));
		} catch (ParseException e) {
			e.printStackTrace();
		}

		String strY = null;
		int x = localTime.get(Calendar.YEAR);
		int y = localTime.get(Calendar.MONTH) + 1;
		strY = y >= 10 ? String.valueOf(y) : ("0" + y);

		return x + "-" + strY + "-01";
	}

		
		
	/**
	 * 月末xxxx-yy-zz (eg: 2007-12-31)
	 * 
	 * @return String
	 * @author pure
	 **/
	public static String getMonthEnd(String today) {
		
		Calendar localTime = Calendar.getInstance();
		
		try {
			localTime.setTime(YYYTMM.parse(today));
		} catch (ParseException e) {
			e.printStackTrace();
		}

		
		String strY = null;
		String strZ = null;
		boolean leap = false;
		int year = localTime.get(Calendar.YEAR);
		int month = localTime.get(Calendar.MONTH) + 1;
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
				|| month == 10 || month == 12) {
			strZ = "31";
		}
		if (month == 4 || month == 6 || month == 9 || month == 11) {
			strZ = "30";
		}
		if (month == 2) {
			leap = leapYear(year);
			if (leap) {
				strZ = "29";
			} else {
				strZ = "28";
			}
		}
		strY = month >= 10 ? String.valueOf(month) : ("0" + month);
		return year + "-" + strY + "-" + strZ;
	}
	
	/**
	 * @param today yyyy-mm-dd 
	 * @return 月份最大天数
	 */
	public static String getMonthEndDay(String today) {
		
		Calendar localTime = Calendar.getInstance();
		
		try {
			localTime.setTime(YYYTMM.parse(today));
		} catch (ParseException e) {
			e.printStackTrace();
		}

		
		String strZ = null;
		boolean leap = false;
		int year = localTime.get(Calendar.YEAR);
		int month = localTime.get(Calendar.MONTH) + 1;
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
				|| month == 10 || month == 12) {
			strZ = "31";
		}
		if (month == 4 || month == 6 || month == 9 || month == 11) {
			strZ = "30";
		}
		if (month == 2) {
			leap = leapYear(year);
			if (leap) {
				strZ = "29";
			} else {
				strZ = "28";
			}
		}
		return  strZ;
	}
	/**
	 * 是否是闰年
	 * 
	 * @param year
	 * @return ???true ??false
	 * @author pure
	 */
	private static boolean leapYear(int year) {
		boolean leap;
		if (year % 4 == 0) {
			if (year % 100 == 0) {
				if (year % 400 == 0)
					leap = true;
				else
					leap = false;
			} else
				leap = true;
		} else
			leap = false;
		return leap;
	}


	/**
	 * 获取当前日期是星期几
	 * 
	 * @param date
	 * @return 当前日期是星期几 星期日 0 星期一 1 星期二 2 星期三 3 星期四 4 星期五 5 星期六 6
	 */

	public static int getWeekOfDate(String date) {
		Calendar localTime = Calendar.getInstance();
		try {
			localTime.setTime(YYYTMM.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
		}

		int[] weekDays = { 0, 1, 2, 3, 4, 5, 6 };
		int w = localTime.get(Calendar.DAY_OF_WEEK) - 1;
		if (w < 0)
			w = 0;

		return weekDays[w];
	}
	
	/**
	 * 获取当前日期是星期几
	 * 
	 * @param date
	 * @return 当前日期是星期几 星期日 0 星期一 1 星期二 2 星期三 3 星期四 4 星期五 5 星期六 6
	 */

	public static String getWeekOfDateToString(String date) {
		Calendar localTime = Calendar.getInstance();

		try {
			localTime.setTime(YYYY_MM_DD.parse(date));
		} catch (ParseException e) {
			return "----";
		}

		int[] weekDays = { 0, 1, 2, 3, 4, 5, 6 };
		int w = localTime.get(Calendar.DAY_OF_WEEK) - 1;
		if (w < 0)
			w = 0;

	
		
		switch (weekDays[w]) {

		case 0:
			
			return "日";
		case 1:
			
			return "一";
			
		case 2:
			
			return "二";
			
		case 3:
			
			return "三";
			
		case 4:
			
			return "四";
			
		case 5:
			
			return "五";
			
		case 6:
			
			return "六";

		default:
			
			return "----";
		}
		
		
		
	}

	/**
	 * //当前月的最后一天是几号
	 * 
	 * @return
	 */
	public static int getLastday(String date) {

		Calendar c = Calendar.getInstance();
		try {
			c.setTime(YYYTMM.parse(date));
		} catch (ParseException e) {
		}

		int lastday = c.getActualMaximum(Calendar.DAY_OF_MONTH);

		return lastday;
	}
	
	 /**  
     * 获得日期字符串数组  
     * @param calendarType 日期跨度的类型,  
     * */  
       
    public static Date[] getDateArrays(Date start,Date end ,int calendarType){
        ArrayList<Date> ret = new ArrayList<Date>();   
        Calendar calendar = Calendar.getInstance();   
        calendar.setTime(start);   
        calendar.add(calendarType, 1);   
        Date tmpDate = calendar.getTime();   
        long endTime = end.getTime();   
        while(tmpDate.before(end)||tmpDate.getTime() < endTime){
            ret.add(calendar.getTime());   
            calendar.add(calendarType, 1);   
            tmpDate = calendar.getTime();   
        }          
        
        Date[] dates = new Date[ret.size()];   
        return ret.toArray(dates);         
    }   
	
    /**
     * 描述:获取当前日期及时间
     * @return
     */
    public static String getNowDateTime(){
    	return YYYY_MM_DD_HH_mm_ss.format(new Date());         
    }

	/**
	 * 将日期转换成指定格式的字符串
	 * @param date
	 * @param dateFormatPattern
	 * @return
	 */
	public static String parseDate2StrNormal(Date date,String dateFormatPattern){
		SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormatPattern);
		return dateFormat.format(date);
	}

	/**
	 * 将日期转换成指定格式的字符串
	 * @param date
	 * @param dateFormatPattern
	 * @return
	 */
	public static String parseDate2Str(Date date,SimpleDateFormat dateFormatPattern){
		return dateFormatPattern.format(date);
	}

	/**
	 * 将指定格式的字符串转换成日期
	 * @param date
	 * @param dateFormatPattern
	 * @return
	 */
	public static Date parseStr2Date(String date,SimpleDateFormat dateFormatPattern){
		try {
			return dateFormatPattern.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
     * 获取执行日期的前几天或后几天
     * @param date
     * @param i
     * @return
     */
    public static Date getTagetDay(Date date,int i) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH,i);
		date = calendar.getTime();
		return date;
	}
    
    /**
     * 根据日期判断该日期是否在参数所选的周次中
     * @param dworkdate  指定的日期,格式2015-01-01
     * @param param  周次参数字符串,格式1,2,3  其中星期日 0 星期一 1 星期二 2 星期三 3 星期四 4 星期五 5 星期六 6
     * @return
     */
    public static int judgeInWeek(String dworkdate,String param) {
    	Calendar localTime = Calendar.getInstance();
		try {
			localTime.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(dworkdate));
		} catch (ParseException e) {
			return -1;
		}
		
		List<String> weekDays = Arrays.asList(param.split(","));
		int w = localTime.get(Calendar.DAY_OF_WEEK) - 1;
		if (w < 0) w = 0;
		if(weekDays.contains(""+w)){
			//如果执行日期在参数范围内,返回1,否则返回0
			return 1;
		}else{
			return 0;
		}
	}
    
    /** 
    * 根据开始时间和结束时间返回时间段内的时间集合 
    * @param beginDate 
    * @param endDate 
    * @return List 
     * @throws ParseException 
    */  
    public static List<String> getDatesBetweenTwoDate(String startdate, String enddate) throws ParseException {  
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
        Date beginDate = sdf.parse(startdate);  
        Date endDate = sdf.parse(enddate);
        List<String> lDate = new ArrayList<String>();  
        lDate.add(startdate);// 把开始时间加入集合  
        Calendar cal = Calendar.getInstance();  
        // 使用给定的 Date 设置此 Calendar 的时间  
        cal.setTime(beginDate);  
        boolean bContinue = true;  
        while (bContinue) {  
            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量  
            cal.add(Calendar.DAY_OF_MONTH, 1);  
            // 测试此日期是否在指定日期之后  
            if (endDate.after(cal.getTime())) {  
                lDate.add(sdf.format(cal.getTime()));  
            } else {  
                break;  
            }  
        }  
        
        if (!startdate.equals(enddate)) {
        	lDate.add(enddate);// 把结束时间加入集合  
        }
        return lDate;  
    }  
    
    /**
	 * 根据开始日期和结束日期获取之间的所有日期,并筛选出指定周次的日期,组成sql查询条件
	 * @param bdat
	 * @param edat
	 * @param weekly 周次,0周日,1周一,2周二,3周三,4周四,5周五,6周六。多个中间以逗号隔开,格式:1,2,3  
	 * @param field 组成sql条件的字段
	 * @return
	 * @throws ParseException 
	 */
	public static String getDateStringByBetwBdatEdat(String bdat,String edat,String weekly,String field) throws ParseException{
		//首先根据查询开始日期及结束日期,获取时间段集合
		List<String> datelist = DateFormatUtil.getDatesBetweenTwoDate(bdat, edat);
		List<String> dateresultList=new ArrayList<String>();//定义筛选周次之后要查询的日期的结果集
		for(String date : datelist){
			if(null != weekly && !"".equals(weekly)){
				//如果有传入周次条件,就按周次进行过滤日期
				int cnt=DateFormatUtil.judgeInWeek(date,weekly);
				if(cnt==0){//如果返回0,表示日期不在所选周次内,不纳入结果集
					continue;
				}
			}
			dateresultList.add(date);
		}
		return BohUtils.getSqlStrByList(dateresultList, 1000, field);//将查询日期的集合转化为sql条件
	}
	
	/**
	 * 描述:获取两个日期间的所有月份
	 * @param minDate
	 * @param maxDate
	 * @return
	 * @throws ParseException
	 */
	public static List<String> getMonthBetween(String minDate, String maxDate) {
	    ArrayList<String> result = new ArrayList<String>();
	    Calendar min = Calendar.getInstance();
	    Calendar max = Calendar.getInstance();

	    try {
			min.setTime(YYYTMM.parse(minDate));
		    max.setTime(YYYTMM.parse(maxDate));
		} catch (ParseException e) {
			e.printStackTrace();
		}
	    
	    min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
	    max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
	    Calendar curr = min;
	    
	    while (curr.before(max)) {
	    	result.add(YYYTMM.format(curr.getTime()));
	    	curr.add(Calendar.MONTH, 1);
	    }
	    
	    return result;
	}
	
	/**
	 * 描述:获取所在年的第一个月第一天
	 * @param today
	 * @return
	 */
	public static String getFirstMonth(String today) {

		Calendar localTime = Calendar.getInstance();
		try {
			localTime.setTime(YYYY.parse(today));
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return localTime.get(Calendar.YEAR) + "-01" + "-01";
	}
	
	/**
	 * 描述:两个日期间隔的天数
	 * @param date1	较早日期
	 * @param date2	较晚日期
	 * @return
	 */
	public static int getDay(String date1, String date2) {
        Calendar calst = Calendar.getInstance();;
        Calendar caled = Calendar.getInstance();

        try {
			calst.setTime(YYYY_MM_DD.parse(date1));
	        caled.setTime(YYYY_MM_DD.parse(date2));
		} catch (ParseException e) {
			e.printStackTrace();
		}
 
         //设置时间为0时   
         calst.set(Calendar.HOUR_OF_DAY, 0);   
         calst.set(Calendar.MINUTE, 0);   
         calst.set(Calendar.SECOND, 0);   
         caled.set(Calendar.HOUR_OF_DAY, 0);   
         caled.set(Calendar.MINUTE, 0);   
         caled.set(Calendar.SECOND, 0);   
        
         //得到两个日期相差的天数   
         int days = ((int)(caled.getTime().getTime() / 1000) - 
        		 	(int)(calst.getTime().getTime() / 1000)) / 3600 / 24;   
         
        return days;
	}

	/**
	 * 描述:获取两个日期间的整月开始日期和结束日期
	 * @param minDate
	 * @param maxDate
	 * @return
	 */
	public static Map<String, String> getAllMonthDate(String minDate, String maxDate) {
	    String startDate = minDate;	//整月的开始日期
	    String endDate = maxDate;	//整月的结束日期
	    Calendar min = Calendar.getInstance();
	    Calendar max = Calendar.getInstance();

	    try {
			min.setTime(YYYY_MM_DD.parse(minDate));
		    max.setTime(YYYY_MM_DD.parse(maxDate));
		} catch (ParseException e) {
			e.printStackTrace();
		}
	    
	    int day1 = min.get(Calendar.DAY_OF_MONTH);
	    int day2 = max.get(Calendar.DAY_OF_MONTH);

	    min.set(Calendar.MONTH, min.get(Calendar.MONTH) + 1);
	    min.set(Calendar.DAY_OF_MONTH, 1);
	    max.set(Calendar.DAY_OF_MONTH, 1);
	    max.add(Calendar.DATE, -1);
	    
	    //若minDate不是当月第一天,则赋值startDate为下个月第一天
	    if (1 != day1) {
	    	startDate = YYYY_MM_DD.format(min.getTime());
	    }
	    
	    //若maxDate不是当月最后一天,则赋值endDate为上个月最后一天
	    if (Integer.valueOf(getMonthEndDay(maxDate)) != day2) {
	    	endDate = YYYY_MM_DD.format(max.getTime());
	    }
	    
	    Map<String, String> map = new HashMap<String, String>();
	    map.put("bdat", startDate);
	    map.put("edat", endDate);
	    
	    return map;
	}
	
	/**
	 * 描述: 获取两个时间间隔的时长
	 * @param time1 开始时间
	 * @param time2 结束时间
	 * @return
	 */
	public static String getTimeLong(String time1, String time2) {
		String hours = "";
		String minutes = "";
		try {
			long interval = HH_mm.parse(time2).getTime() - HH_mm.parse(time1).getTime();
			interval = interval > 0 ? interval : interval * -1;
			interval /= 1000 * 60; //分
			long hour = interval / 60;
			long minute = interval % 60;
			
			if (1 == String.valueOf(hour).length()) {
				hours = "0" + hour;
			} else {
				hours = "" + hour;
			}
			
			if (1 == String.valueOf(minute).length()) {
				minutes = "0" + minute;
			} else {
				minutes = "" + minute;
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return hours + ":" + minutes;
	}

	/**
	 * Description: 获取当前对应下一年的年月日时分秒.
	 */
	public static String getNowInNextYear(){
        Calendar curr = Calendar.getInstance();
        curr.set(Calendar.YEAR, curr.get(Calendar.YEAR)+1);
        Date date_year = curr.getTime();
        return YYYY_MM_DD_HH_mm_ss.format(date_year);
	}
	public static void main(String[] args) {
		try {
			System.out.println(getDatesBetweenTwoDate("2017-06-01", "2017-06-01"));
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值