DateUtils-java时间处理工具类

package org.zhibo.commons.lang.utils;

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

import org.apache.commons.lang3.StringUtils;
import org.zhibo.commons.lang.exception.DataParseException;




public class DateUtils {
    /**
     * yyyy-MM-dd
     */
    public static final String DATE_SHORT = "yyyy-MM-dd";
    /**
     * yyyy-MM-dd HH:mm:ss
     */
    public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    /**
     * "yyyyMMddHHmmss"
     */
    public static final String yyyyMMddHHmmss = "yyyyMMddHHmmss";
    /**
     * yyyyMMdd
     */
    public static final String yyyyMMdd = "yyyyMMdd";
    /**
     * yyyy-MM-dd HH:mm:ss
     */
    public static final String defaultPattern = "yyyy-MM-dd HH:mm:ss";

    public static void main(String[] args) {
        System.out.println("所在周第一天的开始时间:" + format(getWeekFirstDayBegin(new Date())));
        System.out.println("所在周最后一天的结束时间:" + format(getWeekLastDayEnd(new Date())));

        System.out.println("得到日期的开始时间:" + format(getDayBegin(new Date())));
        System.out.println("得到日期的开始时间:" + format(getDayEnd(new Date())));
        System.out.println("获取今天的开始时间:" + format(todayBeginTime()));

        System.out.println("获取date前lastDay -1天的时间:" + format(getLastDay(new Date(), 1)));

        System.out.println("获取date前lastDay +1天的时间:" + format(getLastDay(new Date(), -1)));

        System.out.println("天数(如果day数为负数,说明是此日期前的天数)的时间:" + format(getBeforDay(new Date(), 1)));

        System.out.println("天数(如果day数为负数,说明是此日期前的天数)的时间:" + format(getBeforDay(new Date(), -1)));
    }

    public static Date pareseDate(Object value, String pattern, Date defaultValue) {
        if(value == null || StringUtils.isBlank(value.toString()))
            return defaultValue;

        if(value instanceof Date) {
            return (Date)value;
        }

        String formatPattern = defaultPattern;
        if(StringUtils.isNotEmpty(pattern)) {
            formatPattern = pattern;
        }

        return getDateByFormatString(value.toString(), formatPattern);
    }

    /**
     * 获取date前lastDay的时间
     * @param lastDay
     * @return
     */
    public static Date getLastDay(Date date,int lastDay){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, -lastDay);
        return cal.getTime();
    }

    /**
     * 
     * @param date 当前日期
     * @param Day  天数(如果day数为负数,说明是此日期前的天数)
     * @return
     */
    public static Date getBeforDay(Date date,int Day){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, Day);
        return cal.getTime();
    }

    /**判断两个时间是一致
     * @param dateA
     * @param dateB
     * @return
     */
    public static boolean isSameDay(Date dateA, Date dateB) {
        return DateUtils.isSameDay(dateA, dateB);
    }

    /**
     * 根据日期时间字符串转换成date对象
     * @param formatString
     * @return
     */
    public static Date getDateByFormatString(String formatString,String pattern) {
        try {
            return new SimpleDateFormat(pattern).parse(formatString);
        } catch (ParseException e) {
            throw new DataParseException("日期为空或格式不正确", e);
        }
    }
    public static int subDay(Date minuend, Date subtrahend) {
        long diff  = minuend.getTime() - subtrahend.getTime();
        int diffDay = (int) (diff / 1000 / 60 / 60 / 24);
        return diffDay;
    }

    public static int dayOfWeek(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int week = cal.get(Calendar.DAY_OF_WEEK);
        return week;
    }

    public static int year(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(Calendar.YEAR);
    }

    public static Date getLastDayOfYear() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.MONTH, 11);
        cal.set(Calendar.DAY_OF_MONTH, 31);
        return cal.getTime();
    }

    public static String format(Date date) {
        return new SimpleDateFormat(defaultPattern).format(date);
    }

    public static String format(Date date , String format) {
        return new SimpleDateFormat(format).format(date);
    }

    public static String formatShort(Date date) {
        return new SimpleDateFormat(DATE_SHORT).format(date);
    }
    /***
     * 返回按yyyyMMdd返回日期
     * @param date
     * @return
     */
    public static String formatToyyyyMMdd(Date date) {
        return new SimpleDateFormat(yyyyMMdd).format(date);
    }

    /**
     * 得到日期的开始时间
     * @param date
     * @return
     */
    public static Date getDayBegin(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);

        return cal.getTime();
    }

    /**
     * 得到日期的结束时间 
     * @param date
     * @return
     */
    public static Date getDayEnd(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        cal.set(Calendar.MILLISECOND, 999);

        return cal.getTime();
    }

    public static List<Date> getDayBeginAndEnd() {
        List<Date> list = new ArrayList<Date>();
        Calendar cal = Calendar.getInstance();

        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);

        Date start = cal.getTime();
        list.add(start);

        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        list.add(cal.getTime());
        return list;
    }

    //获取今天的开始时间
    public static Date todayBeginTime(){
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 00);
        cal.set(Calendar.MINUTE, 00);
        cal.set(Calendar.SECOND, 00);
        return cal.getTime();

    }

    /**
     * 获取时间戳 省略毫秒
     * @param date ʱ��
     * @return ʱ���
     */
    public static Long getDateLong(Date date){
        return date.getTime() / 1000;
    }
    /**
     * 昨天开始时间
     * @return
     */
    public static Date yesterdaybeginTime(){
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -5);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE,00);
        cal.set(Calendar.SECOND, 00);
        return cal.getTime();

    }
    /**
     * 昨天结束时间
     * @return
     */
    public static Date yesterdayEndTime(){
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE,59);
        cal.set(Calendar.SECOND, 59);
        return cal.getTime();

    }

    /**
     * 根据传入时间 判断当前时间是否过期
     * @param playingTime
     * @return
     */
    public static boolean isMatchStop(Date playingTime){
        if(playingTime!=null){
            if(playingTime.after(new Date())){
                return false;//未停售
            }else{
                return true;//停售
            }
        }
        return false;
    }

    /**
     * 获取当前的年 yyyy
     * @return yyyy
     */
    public static String getNowYear() {
        // TODO Auto-generated method stub
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        return String.valueOf(cal.get(Calendar.YEAR));
    }

    public static Date converTime(String closeTime){
        if(StringUtils.isNotBlank(closeTime)){
            SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
            try {
                return sdf.parse(closeTime);
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return null;
    }
    /**
     * 根据数字参数 转化为  周日.... 
     * 1对应周日 7对应周六
     */
    public static String getWeekDayWithNumber(Integer num){
        String num2=String.valueOf(num);
        switch(num2){
          case "1":return "周日";
          case "2":return "周一";
          case "3":return "周二";
          case "4":return "周三";
          case "5":return "周四";
          case "6":return "周五";
          case "7":return "周六";
          default :return "";
        }
    }
    /**
     * 获取传入时间的星期 
     * @param playingTime
     * @return
     */
    public static String getWeekDayWithTime(Date playingTime){
        if(playingTime!=null){
            Calendar cal=Calendar.getInstance();
            cal.setTime(playingTime);
            int day=cal.get(Calendar.DAY_OF_WEEK);
            switch(day){
              case 1:return "周日";
              case 2:return "周一";
              case 3:return "周二";
              case 4:return "周三";
              case 5:return "周四";
              case 6:return "周五";
              case 7:return "周六";
            }
        }
        return "";
    }

    /**
     * 获取d小时之前的时间
     * @param date
     * @param d
     * @return
     */
    public static Date getLastHoursTime(Date date, int d) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR, -d);
        return cal.getTime();
    }

    /**
     * 计算两个时间的分钟差值
     * @param maxDate
     * @param minDate
     * @return
     */
    public static Long getMinuteOfTwoDate(Date maxDate, Date minDate) {
        long millSeconds = maxDate.getTime()-minDate.getTime();
        return millSeconds/1000/60;
    }

    /**
     * 计算两个时间的秒差值
     * @param maxDate
     * @param minDate
     * @return
     */
    public static Long getSecondOfTwoDate(Date maxDate, Date minDate) {
        long millSeconds = maxDate.getTime()-minDate.getTime();
        return millSeconds/1000;
    }
    /**
     * 
     * 将开始日期和结束日期中间的年月分装成一个map,
     * map的key是年份,value是月份的List集合
     * @param earlyDate
     * @param lastDate
     * @return  
     */
    public static Map<Integer,List<Integer>> splitDate(Date earlyDate,Date lastDate){
        Map<Integer,List<Integer>> map= new LinkedHashMap<Integer,List<Integer>>();
        Calendar cal= Calendar.getInstance();
        cal.setTime(earlyDate);
        int earlyYear=cal.get(Calendar.YEAR);
        int earlyMonth=cal.get(Calendar.MONTH)+1;

        cal.setTime(lastDate);
        int lastYear=cal.get(Calendar.YEAR);
        int lastMonth=cal.get(Calendar.MONTH)+1;

        List<Integer> monthList1=new ArrayList<Integer>();
        List<Integer> monthList2=new ArrayList<Integer>();
        List<Integer> monthList3=new ArrayList<Integer>();

        if(earlyYear==lastYear){
            for(int i=earlyMonth;i<=lastMonth;i++){
                monthList1.add(i);
            }
        }else{
            for(int i=earlyMonth;i<=12;i++){
                monthList1.add(i);
            }
            for(int i=1;i<=12;i++){
                monthList2.add(i);
            }
            for(int i=1;i<=lastMonth;i++){
                monthList3.add(i);
            }
        }   
            for(int i=lastYear;i>=earlyYear;i--){
                if(i==lastYear)
                    map.put(i, monthList1);
                else if(i==earlyYear)
                    map.put(i, monthList3);
                else
                    map.put(i, monthList2);
            }


        return map;
    }

    /**
     * 将时间参数转化为一个时间段
     * @param year
     * @param month
     * @return
     */
    public static Date[] stringToDate(int year,int month){
        Date[] date=new Date[2];
        String early=null;
        String last=null;
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if(month==year&&month==0){
            early="1970-01-01 00:00:00";            
            last=formatter.format(new Date()).toString();
        }
        else if(month>0){
            //TODO 这里会有一个bug
            early=""+year+"-"+month+"-01 00:00:00";
            last=""+year+"-"+month+"-31 23:59:59";
        }
        else{
            early=""+year+"-01-01 00:00:00";
            last=""+year+"-12-31 23:59:59";
        }
        try {
            date[0]=formatter.parse(early);
            date[1]=formatter.parse(last);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    public static Date getBeforWeek(Date date, int weeks) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.WEEK_OF_YEAR, weeks);
        return cal.getTime();
    }

    public static Date getBeforMonth(Date date, int months) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, months);
        return cal.getTime();
    }
    /**
     * 获得所在周第一天的开始时间
     * @param time
     * @return
     */
    public static Date getWeekFirstDayBegin(Date time){
        Calendar cal = Calendar.getInstance();  
        cal.setTime(time);  
        // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了  
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天  
        if (1 == dayWeek) {  
            cal.add(Calendar.DAY_OF_MONTH, -1);  
        }
        cal.setFirstDayOfWeek(Calendar.MONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一

        int day = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天  
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值

        return getDayBegin(cal.getTime());
    }



    /**
     * 获得所在周最后一天的结束时间
     * @param time
     * @return
     */
    public static Date getWeekLastDayEnd(Date time){
        Calendar cal = Calendar.getInstance();  
        cal.setTime(time);  
        // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了  
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天  
        if (1 == dayWeek) {  
            cal.add(Calendar.DAY_OF_MONTH, -1);  
        }
        cal.setFirstDayOfWeek(Calendar.MONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一

        int day = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天  
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值

        cal.add(Calendar.DATE, 6);

        return getDayEnd(cal.getTime());
    }

    /**
     * 获得所在月第一天的开始时间
     * @param time
     * @return
     */
    public static Date getMonthFirstDayBegin(Date date) {
        Calendar calendar = Calendar.getInstance();  
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, 1);

        return getDayBegin(calendar.getTime());  
    }

    /**
     * 获得所在月的最后一天的结束时间
     * @param time
     * @return
     */
    public static Date getMonthLastDayEnd(Date date) {
        Calendar calendar = Calendar.getInstance();  
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.add(Calendar.DAY_OF_MONTH, -1);

        return getDayEnd(calendar.getTime());  
    }

//  public static void main(String[] args) throws ParseException{
//      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//      
//      String dateString = "2017-05-02";
//      Date date = sdf.parse(dateString);
//
//      Calendar cal = Calendar.getInstance();  
//        cal.setTime(date);  
//        
//        System.out.println(cal.get(Calendar.WEEK_OF_MONTH));
//
//        cal.setFirstDayOfWeek(Calendar.MONDAY);
//        
//        System.out.println(cal.get(Calendar.WEEK_OF_MONTH));
//  }
//  
    public static Date getDateByFormat(String dateStr, String dateFormat){
        SimpleDateFormat simpleDate = new SimpleDateFormat(dateFormat);
        Date date = null;
        try {
            date = simpleDate.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 根据指定格式,返回更改后的时间 
     * @param date
     * @param dateFormat yyyy-MM-dd 00:00:00
     * @return
     */
    public static Date getDateByFormat2(Date date, String dateFormat){
        SimpleDateFormat simpleDate = new SimpleDateFormat(dateFormat);
        String dateStr = simpleDate.format(date);
        return getDateByFormat(dateStr, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 加减时间
     * @param date 需要加减的时间
     * @param cal 1为秒,2为分,3为小时,4为天,5为月,6为年
     * @param num 加减的数量
     * @return 加减后的时间
     */
    public static Date addDate(Date date, Integer cal, Integer num){
        Calendar rightNow = Calendar.getInstance();
        rightNow.setTime(date);
        if(cal == 1){
            //秒
            rightNow.add(Calendar.SECOND, num);
        }else if(cal == 2){
            //分
            rightNow.add(Calendar.MINUTE, num);
        }else if(cal == 3){
            //小时
            rightNow.add(Calendar.HOUR, num);
        }else if(cal == 4){
            //天
            rightNow.add(Calendar.DATE, num);
        }else if(cal == 5){
            //月
            rightNow.add(Calendar.MONTH, num);
        }else if(cal == 6){
            //年
            rightNow.add(Calendar.YEAR, num);
        }
        return rightNow.getTime();
    }

    public static Long getDateLong(){
        Date date = new Date();
        return getDateLong(date);
    }

    /**
     * 根据时间戳转换成日期
     * @param time
     * @return
     * @throws ParseException
     */
    public static Date getDateByLong(Long time) throws ParseException{
        SimpleDateFormat simpleDate = new SimpleDateFormat(DateUtils.DATE_FORMAT);
        String dateStr = simpleDate.format(time);
        return simpleDate.parse(dateStr);
    }

}

猜你喜欢

转载自blog.csdn.net/yueaini10000/article/details/79897441