美文网首页
04DateUtils工具类

04DateUtils工具类

作者: 安以北往南 | 来源:发表于2019-07-30 14:10 被阅读0次
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.sql.Timestamp;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;
    
    /**
     * @ClassName:DateHelper
     * @Description: <p>  日期工具类   </p>
     * @Author: - Jason
     * @CreatTime:2019/7/23 - 10:52
     * @Modify By:
     * @ModifyTime: 2019/7/23
     * @Modify marker:
     * @version V1.0
    */
    public class DateHelper extends org.apache.commons.lang3.time.DateUtils {
    
        private static final Logger logger  = LoggerFactory.getLogger(DateHelper.class);
    
        /**
         * 一天的MilliSecond
         */
        public static final long DAY_MILLI = 24 * 60 * 60 * 1000;
    
        public final static int LEFT_OPEN_RIGHT_OPEN = 1;
        public final static int LEFT_CLOSE_RIGHT_OPEN = 2;
        public final static int LEFT_OPEN_RIGHT_CLOSE = 3;
        public final static int LEFT_CLOSE_RIGHT_CLOSE = 4;
        /**
         * 比较日期的模式 --只比较日期,不比较时间
         */
        public final static int COMP_MODEL_DATE = 1;
        /**
         * 比较日期的模式 --只比较时间,不比较日期
         */
        public final static int COMP_MODEL_TIME = 2;
        /**
         * 比较日期的模式 --比较日期,也比较时间
         */
        public final static int COMP_MODEL_DATETIME = 3;
    
        /**
         * 时-分
         */
        public static final String TIME_WITH_MINUTE_PATTERN = "HH:mm";
    
        /**
         * 要用到的DATE Format的定义 年/月/日
         */
        public static String DATE_FORMAT_DATEONLY = "yyyy-MM-dd";
    
        /**
         * yyyyMMdd
         */
        public static String NO_LINE_FORMAT_DATEONLY = "yyyyMMdd";
    
        /**
         * 年/月/日
         */
        public static String DATE_FORMAT_DATETIME = "yyyy-MM-dd HH:mm:ss";
    
        /**
         * Global SimpleDateFormat object
         */
        public static SimpleDateFormat sdfDateTime = new SimpleDateFormat(DateHelper.DATE_FORMAT_DATETIME);
        public static SimpleDateFormat SDF_DATE_ONLY = new SimpleDateFormat(DateHelper.DATE_FORMAT_DATEONLY);
        public static final SimpleDateFormat SHORTDATEFORMAT = new SimpleDateFormat("yyyyMMdd");
        public static final SimpleDateFormat SHORT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
        public static final SimpleDateFormat LONG_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        public static final SimpleDateFormat HMS_FORMAT = new SimpleDateFormat("HH:mm:ss");
        public static final SimpleDateFormat formatTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        /**
         * 根据日期格式字符串解析日期字符串
         * @param str
         *            日期字符串
         * @param parsePatterns
         *            日期格式字符串
         * @return 解析后日期
         * @throws ParseException
         */
        public static Date parseDate(String str, String parsePatterns) {
            try {
                return parseDate(str, new String[] { parsePatterns });
            } catch (ParseException e) {
                logger.error(e.getMessage());
                return null;
            }
        }
    
        /**
         * 根据单位字段比较两个日期
         * @param date
         *            日期1
         * @param otherDate
         *            日期2
         * @param withUnit
         *            单位字段,从Calendar field取值
         * @return 等于返回0值, 大于返回大于0的值 小于返回小于0的值
         */
        public static int compareDate(Date date, Date otherDate, int withUnit) {
            Calendar dateCal = Calendar.getInstance();
            dateCal.setTime(date);
            Calendar otherDateCal = Calendar.getInstance();
            otherDateCal.setTime(otherDate);
    
            switch (withUnit) {
            case Calendar.YEAR:
                dateCal.clear(Calendar.MONTH);
                otherDateCal.clear(Calendar.MONTH);
            case Calendar.MONTH:
                dateCal.set(Calendar.DATE, 1);
                otherDateCal.set(Calendar.DATE, 1);
            case Calendar.DATE:
                dateCal.set(Calendar.HOUR_OF_DAY, 0);
                otherDateCal.set(Calendar.HOUR_OF_DAY, 0);
            case Calendar.HOUR:
                dateCal.clear(Calendar.MINUTE);
                otherDateCal.clear(Calendar.MINUTE);
            case Calendar.MINUTE:
                dateCal.clear(Calendar.SECOND);
                otherDateCal.clear(Calendar.SECOND);
            case Calendar.SECOND:
                dateCal.clear(Calendar.MILLISECOND);
                otherDateCal.clear(Calendar.MILLISECOND);
            case Calendar.MILLISECOND:
                break;
            default:
                throw new IllegalArgumentException("withUnit 单位字段 " + withUnit + " 不合法!!");
            }
            return dateCal.compareTo(otherDateCal);
        }
    
        /**
         * 根据单位字段比较两个时间
         * 
         * @param date
         *            时间1
         * @param otherDate
         *            时间2
         * @param withUnit
         *            单位字段,从Calendar field取值
         * @return 等于返回0值, 大于返回大于0的值 小于返回小于0的值
         */
        public static int compareTime(Date date, Date otherDate, int withUnit) {
            Calendar dateCal = Calendar.getInstance();
            dateCal.setTime(date);
            Calendar otherDateCal = Calendar.getInstance();
            otherDateCal.setTime(otherDate);
    
            dateCal.clear(Calendar.YEAR);
            dateCal.clear(Calendar.MONTH);
            dateCal.set(Calendar.DATE, 1);
            otherDateCal.clear(Calendar.YEAR);
            otherDateCal.clear(Calendar.MONTH);
            otherDateCal.set(Calendar.DATE, 1);
            switch (withUnit) {
            case Calendar.HOUR:
                dateCal.clear(Calendar.MINUTE);
                otherDateCal.clear(Calendar.MINUTE);
            case Calendar.MINUTE:
                dateCal.clear(Calendar.SECOND);
                otherDateCal.clear(Calendar.SECOND);
            case Calendar.SECOND:
                dateCal.clear(Calendar.MILLISECOND);
                otherDateCal.clear(Calendar.MILLISECOND);
            case Calendar.MILLISECOND:
                break;
            default:
                throw new IllegalArgumentException("withUnit 单位字段 " + withUnit + " 不合法!!");
            }
            return dateCal.compareTo(otherDateCal);
        }
    
        /**
         * 获得当前的日期毫秒
         * 
         * @return
         */
        public static long nowTimeMillis() {
            return System.currentTimeMillis();
        }
    
        /**
         * 获得当前的时间戳
         * 
         * @return
         */
        public static Timestamp nowTimeStamp() {
            return new Timestamp(nowTimeMillis());
        }
    
        /**
         * yyyy-MM-dd 当前日期
         * 
         */
        public static String getReqDate() {
            return SHORTDATEFORMAT.format(new Date());
        }
    
        /**
         * yyyy-MM-dd 传入日期
         * 
         * @param date
         * @return
         */
        public static String getReqDate(Date date) {
            return SHORT_DATE_FORMAT.format(date);
        }
    
        /**
         * yyyyMMdd 传入日期
         * 
         * @param date
         * @return
         */
        public static String getReqDateyyyyMMdd(Date date) {
            return SHORTDATEFORMAT.format(date);
        }
    
        /**
         * yyyy-MM-dd 传入的时间戳
         * 
         * @param tmp
         * @return
         */
        public static String TimestampToDateStr(Timestamp tmp) {
            return SHORT_DATE_FORMAT.format(tmp);
        }
    
        /**
         * HH:mm:ss 当前时间
         * 
         * @return
         */
        public static String getReqTime() {
            return HMS_FORMAT.format(new Date());
        }
    
        /**
         * 得到时间戳格式字串
         * 
         * @param date
         * @return
         */
        public static String getTimeStampStr(Date date) {
            return LONG_DATE_FORMAT.format(date);
        }
    
        /**
         * 得到长日期格式字串
         * 
         * @return
         */
        public static String getLongDateStr() {
            return LONG_DATE_FORMAT.format(new Date());
        }
    
        public static String getLongDateStr(Timestamp time) {
            return LONG_DATE_FORMAT.format(time);
        }
    
        /**
         * 得到短日期格式字串
         * 
         * @param date
         * @return
         */
        public static String getShortDateStr(Date date) {
            return SHORT_DATE_FORMAT.format(date);
        }
    
        /**
         * 短日期没有分割的 yyyymmdd
         * @param date
         * @return
         */
        public static String getShortDateStrNoSplit(Date date) {
            return SHORTDATEFORMAT.format(date);
        }
    
        public static String getShortDateStr() {
            return SHORT_DATE_FORMAT.format(new Date());
        }
    
        /**
         * 计算 second 秒后的时间
         * 
         * @param date
         * @param second
         * @return
         */
        public static Date addSecond(Date date, int second) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.SECOND, second);
            return calendar.getTime();
        }
    
        /**
         * 计算 minute 分钟后的时间
         * 
         * @param date
         * @param minute
         * @return
         */
        public static Date addMinute(Date date, int minute) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.MINUTE, minute);
            return calendar.getTime();
        }
    
        /**
         * 计算 hour 小时后的时间
         * 
         * @param date
         * @param hour
         * @return
         */
        public static Date addHour(Date date, int hour) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.HOUR, hour);
            return calendar.getTime();
        }
    
        /**
         * 得到day的起始时间点。
         * 
         * @param date
         * @return
         */
        public static Date getDayStart(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            return calendar.getTime();
        }
    
        /**
         * 得到day的终止时间点.
         * 
         * @param date
         * @return
         */
        public static Date getDayEnd(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            calendar.add(Calendar.DAY_OF_MONTH, 1);
            calendar.add(Calendar.MILLISECOND, -1);
            return calendar.getTime();
        }
    
        /**
         * 计算 day 天后的时间
         * @param date
         * @param day
         * @return
         */
        public static Date addDay(Date date, int day) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.DAY_OF_MONTH, day);
            return calendar.getTime();
        }
    
        /**
         * 得到month的终止时间点.
         * @param date
         * @return
         */
        public static Date getMonthEnd(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            calendar.add(Calendar.MONTH, 1);
            calendar.add(Calendar.MILLISECOND, -1);
            return calendar.getTime();
        }
    
        /**
         * addYear
         * @param date
         * @param year
         * @return
         */
        public static Date addYear(Date date, int year) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.DAY_OF_YEAR, 365 * year);
            return calendar.getTime();
        }
    
        /**
         * strToTimestamp
         * @param dateStr
         * @return
         */
        public static Timestamp strToTimestamp(String dateStr) {
            return Timestamp.valueOf(dateStr);
        }
    
        /**
         * strToTimestamp
         * @param date
         * @return
         */
        public static Timestamp strToTimestamp(Date date) {
            return Timestamp.valueOf(formatTimestamp.format(date));
        }
    
        /**
         * getCurTimestamp
         * @return
         */
        public static Timestamp getCurTimestamp() {
            return Timestamp.valueOf(formatTimestamp.format(new Date()));
        }
    
        /**
         * 取得两个日期之间的日数
         * @return t1到t2间的日数,如果t2 在 t1之后,返回正数,否则返回负数
         */
        public static long daysBetween(Timestamp t1, Timestamp t2) {
            return (t2.getTime() - t1.getTime()) / DAY_MILLI;
        }
    
        /**
         * 返回java.sql.Timestamp型的SYSDATE
         * @return java.sql.Timestamp型的SYSDATE
         * @since 1.0
         * @history
         */
        public static Timestamp getSysDateTimestamp() {
            return new Timestamp(System.currentTimeMillis());
        }
    
        /**
         * 利用缺省的Date格式(YYYY/MM/DD)转换String到java.sql.Timestamp
         * @param sDate
         *            Date string
         * @return
         * @since 1.0
         * @history
         */
        public static Timestamp toSqlTimestamp(String sDate) {
            if (sDate == null) {
                return null;
            }
            if (sDate.length() != DateHelper.DATE_FORMAT_DATEONLY.length()
                    &&sDate.length() != DateHelper.DATE_FORMAT_DATETIME.length()) {
                return null;
            }
            return toSqlTimestamp(sDate,
                    sDate.length() == DateHelper.DATE_FORMAT_DATEONLY.length()
                    ?DateHelper.DATE_FORMAT_DATEONLY
                    :DateHelper.DATE_FORMAT_DATETIME);
        }
    
        /**
         * 利用缺省的Date格式(YYYY/MM/DD hh:mm:ss)转化String到java.sql.Timestamp
         * @param sDate
         *            Date string
         * @param sFmt
         *            Date format DATE_FORMAT_DATEONLY/DATE_FORMAT_DATETIME
         * @return
         * @since 1.0
         * @history
         */
        public static Timestamp toSqlTimestamp(String sDate, String sFmt) {
            String temp = null;
            if (sDate == null || sFmt == null) {
                return null;
            }
            if (sDate.length() != sFmt.length()) {
                return null;
            }
            if (sFmt.equals(DateHelper.DATE_FORMAT_DATETIME)) {
                temp = sDate.replace('/', '-');
                temp = temp + ".000000000";
            } else if (sFmt.equals(DateHelper.DATE_FORMAT_DATEONLY)) {
                temp = sDate.replace('/', '-');
                temp = temp + " 00:00:00.000000000";
            } else {
                return null;
            }
            return Timestamp.valueOf(temp);
        }
    
        /**
         * 以YYYY/MM/DD HH24:MI:SS格式返回系统日期时间
         * @return 系统日期时间
         * @since 1.0
         * @history
         */
        public static String getSysDateTimeString() {
            return toString(new Date(System.currentTimeMillis()), DateHelper.sdfDateTime);
        }
    
        /**
         * 根据指定的Format转化java.util.Date到String
         * @param dt
         *            java.util.Date instance
         * @param sFmt
         *            Date format , DATE_FORMAT_DATEONLY or DATE_FORMAT_DATETIME
         * @return
         * @since 1.0
         * @history
         */
        public static String toString(Date dt, String sFmt) {
            if (dt == null || sFmt == null || "".equals(sFmt)) {
                return "";
            }
            return toString(dt, new SimpleDateFormat(sFmt));
        }
    
        /**
         * 利用指定SimpleDateFormat instance转换java.util.Date到String
         * @param dt
         *            java.util.Date instance
         * @param formatter
         *            SimpleDateFormat Instance
         * @return
         * @since 1.0
         * @history
         */
        private static String toString(Date dt, SimpleDateFormat formatter) {
            String sRet ;
            try {
                sRet = formatter.format(dt);
            } catch (Exception e) {
                logger.error(e.getMessage());
                sRet = null;
            }
            return sRet;
        }
    
        /**
         * 转换java.sql.Timestamp到String,格式为YYYY/MM/DD HH24:MI
         * @param dt
         *            java.sql.Timestamp instance
         * @return
         * @since 1.0
         * @history
         */
        public static String toSqlTimestampString2(Timestamp dt) {
            if (dt == null) {
                return null;
            }
            String temp = toSqlTimestampString(dt, DateHelper.DATE_FORMAT_DATETIME);
            return temp.substring(0, 16);
        }
    
        /**
         * toString
         * @param dt
         * @return
         */
        public static String toString(Timestamp dt) {
            return dt == null ? "" : toSqlTimestampString2(dt);
        }
    
        /**
         * 根据指定的格式转换java.sql.Timestamp到String
         * @param dt
         *            java.sql.Timestamp instance
         * @param sFmt
         *            Date 格式,DATE_FORMAT_DATEONLY/DATE_FORMAT_DATETIME/
         *            DATE_FORMAT_SESSION
         * @return
         * @since 1.0
         * @history
         */
        public static String toSqlTimestampString(Timestamp dt, String sFmt) {
            String temp ;
            String out = null;
            if (dt == null || sFmt == null) {
                return null;
            }
            temp = dt.toString();
            if (sFmt.equals(DateHelper.DATE_FORMAT_DATETIME) ||
                    sFmt.equals(DateHelper.DATE_FORMAT_DATEONLY)) {
                temp = temp.substring(0, sFmt.length());
                out = temp.replace('/', '-');
            }
            return out;
        }
    
        /**
         * 得到当前日期的星期
         * @return
         */
        public static int getWeek() {
            Calendar cal = Calendar.getInstance();
            cal.setTime(new Date());
            int w = cal.get(Calendar.DAY_OF_WEEK);
            return w;
        }
    
        /**
         * Timestamp 格式转换成yyyy-MM-dd timestampToSql(Timestamp 格式转换成yyyy-MM-dd)
         * @param timestamp
         *            时间
         * @return createTimeStr yyyy-MM-dd 时间
         * @Exception 异常对象
         * @since V1.0
         */
        public static String timestampToStringYMD(Timestamp timestamp) {
            SimpleDateFormat sdf = new SimpleDateFormat(DateHelper.DATE_FORMAT_DATEONLY);
            String createTimeStr = sdf.format(timestamp);
            return createTimeStr;
        }
    
        /**
         * yyyyMMdd
         * @param timestamp
         * @return
         */
        public static String timestamp2StrYmd(Timestamp timestamp) {
            SimpleDateFormat sdf = new SimpleDateFormat(DateHelper.NO_LINE_FORMAT_DATEONLY);
            String createTimeStr = sdf.format(timestamp);
            return createTimeStr;
        }
    
        /**
         * 判断一个时间是否在某个时间区间内
         * @param now
         *            目标时间
         * @param start
         *            时间区间开始
         * @param end
         *            时间区间结束
         * @param model
         *            区间模式
         * @return 是否在区间内
         */
        public static boolean isBetween(Date now, Date start, Date end, int model) {
            return isBetween(now, start, end, model, LEFT_OPEN_RIGHT_OPEN);
        }
    
        /**
         * 判断时间是否在制定的时间段之类
         * @param date
         *            需要判断的时间
         * @param start
         *            时间段的起始时间
         * @param end
         *            时间段的截止时间
         * @param interModel
         *            区间的模式
         *
         *            <pre>
         *      取值:
         *          LEFT_OPEN_RIGHT_OPEN
         *          LEFT_CLOSE_RIGHT_OPEN
         *          LEFT_OPEN_RIGHT_CLOSE
         *          LEFT_CLOSE_RIGHT_CLOSE
         * </pre>
         * @param compModel
         *            比较的模式
         *
         *            <pre>
         *      取值:
         *          COMP_MODEL_DATE     只比较日期,不比较时间
         *          COMP_MODEL_TIME     只比较时间,不比较日期
         *          COMP_MODEL_DATETIME 比较日期,也比较时间
         * </pre>
         * @return
         */
        public static boolean isBetween(Date date, Date start, Date end, int interModel, int compModel) {
            if (date == null || start == null || end == null) {
                throw new IllegalArgumentException("日期不能为空");
            }
            SimpleDateFormat format = null;
            switch (compModel) {
            case COMP_MODEL_DATE: {
                format = new SimpleDateFormat("yyyyMMdd");
                break;
            }
            case COMP_MODEL_TIME: {
                format = new SimpleDateFormat("HHmmss");
                break;
            }
            case COMP_MODEL_DATETIME: {
                format = new SimpleDateFormat("yyyyMMddHHmmss");
                break;
            }
            default: {
                throw new IllegalArgumentException(String.format("日期的比较模式[%d]有误", compModel));
            }
            }
            long dateNumber = Long.parseLong(format.format(date));
            long startNumber = Long.parseLong(format.format(start));
            long endNumber = Long.parseLong(format.format(end));
            switch (interModel) {
            case LEFT_OPEN_RIGHT_OPEN: {
                if (dateNumber <= startNumber || dateNumber >= endNumber) {
                    return false;
                } else {
                    return true;
                }
            }
            case LEFT_CLOSE_RIGHT_OPEN: {
                if (dateNumber < startNumber || dateNumber >= endNumber) {
                    return false;
                } else {
                    return true;
                }
            }
            case LEFT_OPEN_RIGHT_CLOSE: {
                if (dateNumber <= startNumber || dateNumber > endNumber) {
                    return false;
                } else {
                    return true;
                }
            }
            case LEFT_CLOSE_RIGHT_CLOSE: {
                if (dateNumber < startNumber || dateNumber > endNumber) {
                    return false;
                } else {
                    return true;
                }
            }
            default: {
                throw new IllegalArgumentException(String.format("日期的区间模式[%d]有误", interModel));
            }
            }
        }
    
        /**
         * 得到当前周起始时间
         * @param date
         * @return
         */
        public static Date getWeekStart(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.get(Calendar.WEEK_OF_YEAR);
            int firstDay = calendar.getFirstDayOfWeek();
            calendar.set(Calendar.DAY_OF_WEEK, firstDay);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            return calendar.getTime();
        }
    
        /**
         * 得到当前周截止时间
         * @param date
         * @return
         */
        public static Date getWeekEnd(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.get(Calendar.WEEK_OF_YEAR);
            int firstDay = calendar.getFirstDayOfWeek();
            calendar.set(Calendar.DAY_OF_WEEK, 8 - firstDay);
            calendar.set(Calendar.HOUR_OF_DAY, 23);
            calendar.set(Calendar.MINUTE, 59);
            calendar.set(Calendar.SECOND, 59);
            calendar.set(Calendar.MILLISECOND, 0);
            return calendar.getTime();
        }
    
        /**
         * 获取当前日期的 一周的范围
         * @param date
         * @return
         */
        public static String  getWeekDayPeriodStr(Date date){
            StringBuffer stringBuffer = new StringBuffer();
            Date weekStart = getWeekStart(date);
            Date weekEnd = getWeekEnd(date);
            stringBuffer.append(getShortDateStrNoSplit(weekStart)).append("-").append(getShortDateStrNoSplit(weekEnd));
            return stringBuffer.toString();
        }
        /**
         * 得到当月起始时间
         *
         * @param date
         * @return
         */
        public static Date getMonthStart(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            return calendar.getTime();
        }
    
        /**
         * 得到当前年起始时间
         * @param date
         * @return
         */
        public static Date getYearStart(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR));
            calendar.set(Calendar.MONTH, 0);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            return calendar.getTime();
        }
    
        /**
         * 得到当前年最后一天
         * @param date
         * @return
         */
        public static Date getYearEnd(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR));
            calendar.set(Calendar.MONTH, 11);
            calendar.set(Calendar.DAY_OF_MONTH, 31);
            calendar.set(Calendar.HOUR_OF_DAY, 23);
            calendar.set(Calendar.MINUTE, 59);
            calendar.set(Calendar.SECOND, 59);
            calendar.set(Calendar.MILLISECOND, 0);
            return calendar.getTime();
        }
    
        /**
         * 取得月天数
         * @param date
         * @return
         */
        public static int getDayOfMonth(Date date) {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            return c.getActualMaximum(Calendar.DAY_OF_MONTH);
        }
    
        /**
         * 取得月第一天
         * @param date
         * @return
         */
        public static Date getFirstDateOfMonth(Date date) {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            c.set(Calendar.DAY_OF_MONTH, c.getActualMinimum(Calendar.DAY_OF_MONTH));
            return c.getTime();
        }
    
        /**
         * 取得月最后一天
         * @param date
         * @return
         */
        public static Date getLastDateOfMonth(Date date) {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
            return c.getTime();
        }
    
        /**
         * 取得季度第一天
         * @param date
         * @return
         */
        public static Date getSeasonStart(Date date) {
            return getDayStart(getFirstDateOfMonth(getSeasonDate(date)[0]));
        }
    
        /**
         * 取得季度最后一天
         * @param date
         * @return
         */
        public static Date getSeasonEnd(Date date) {
            return getDayEnd(getLastDateOfMonth(getSeasonDate(date)[2]));
        }
    
        /**
         * 取得季度月
         * @param date
         * @return
         */
        public static Date[] getSeasonDate(Date date) {
            Date[] season = new Date[3];
    
            Calendar c = Calendar.getInstance();
            c.setTime(date);
    
            int nSeason = getSeason(date);
            // 第一季度
            if (nSeason == 1) {
                c.set(Calendar.MONTH, Calendar.JANUARY);
                season[0] = c.getTime();
                c.set(Calendar.MONTH, Calendar.FEBRUARY);
                season[1] = c.getTime();
                c.set(Calendar.MONTH, Calendar.MARCH);
                season[2] = c.getTime();
                // 第二季度
            } else if (nSeason == 2) {
                c.set(Calendar.MONTH, Calendar.APRIL);
                season[0] = c.getTime();
                c.set(Calendar.MONTH, Calendar.MAY);
                season[1] = c.getTime();
                c.set(Calendar.MONTH, Calendar.JUNE);
                season[2] = c.getTime();
                // 第三季度
            } else if (nSeason == 3) {
                c.set(Calendar.MONTH, Calendar.JULY);
                season[0] = c.getTime();
                c.set(Calendar.MONTH, Calendar.AUGUST);
                season[1] = c.getTime();
                c.set(Calendar.MONTH, Calendar.SEPTEMBER);
                season[2] = c.getTime();
                // 第四季度
            } else if (nSeason == 4) {
                c.set(Calendar.MONTH, Calendar.OCTOBER);
                season[0] = c.getTime();
                c.set(Calendar.MONTH, Calendar.NOVEMBER);
                season[1] = c.getTime();
                c.set(Calendar.MONTH, Calendar.DECEMBER);
                season[2] = c.getTime();
            }
            return season;
        }
    
        /**
         * 1 第一季度 2 第二季度 3 第三季度 4 第四季度
         * @param date
         * @return
         */
        public static int getSeason(Date date) {
    
            int season = 0;
    
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            int month = c.get(Calendar.MONTH);
            switch (month) {
            case Calendar.JANUARY:
            case Calendar.FEBRUARY:
            case Calendar.MARCH:
                season = 1;
                break;
            case Calendar.APRIL:
            case Calendar.MAY:
            case Calendar.JUNE:
                season = 2;
                break;
            case Calendar.JULY:
            case Calendar.AUGUST:
            case Calendar.SEPTEMBER:
                season = 3;
                break;
            case Calendar.OCTOBER:
            case Calendar.NOVEMBER:
            case Calendar.DECEMBER:
                season = 4;
                break;
            default:
                break;
            }
            return season;
        }
    
        /**
         * 字符串转date
         * @param dateString
         * @return
         */
        public static Date StringToDate(String dateString) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
            Date date = null;
            try {
                date = sdf.parse(dateString);
            } catch (ParseException e) {
                logger.error(e.getMessage());
            }
            return date;
        }
    
        /**
         * 判断输入日期是一个星期中的第几天(星期天为一个星期第一天)
         * @param date
         * @return
         */
        public static int getWeekIndex(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            return calendar.get(Calendar.DAY_OF_WEEK);
        }
    
        /**
         * 当前时间的前几天
         * @param days
         * @return
         */
        public static Date subDays(int days) {
            Date date = addDay(new Date(), -days);
            String dateStr = getReqDate(date);
            Date date1 = null;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            try {
                date1 = sdf.parse(dateStr);
            } catch (ParseException e) {
                logger.error(e.getMessage());
            }
            return date1;
        }
    
        /**
         * 判断开始时间和结束时间,是否超出了当前时间的一定的间隔数限制 如:开始时间和结束时间,不能超出距离当前时间90天
         * @param startDate
         *            开始时间
         * @param endDate
         *            结束时间按
         * @param interval
         *            间隔数
         * @param dateUnit
         *            单位(如:月,日),参照Calendar的时间单位
         * @return
         */
        public static boolean isOverIntervalLimit(Date startDate, Date endDate, int interval, int dateUnit) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(new Date());
            cal.add(dateUnit, interval * (-1));
            Date curDate = getDayStart(cal.getTime());
            if (getDayStart(startDate).compareTo(curDate) < 0 || getDayStart(endDate).compareTo(curDate) < 0) {
                return true;
            }
            return false;
        }
    
        /**
         * 判断开始时间和结束时间,是否超出了当前时间的一定的间隔数限制, 时间单位默认为天数 如:开始时间和结束时间,不能超出距离当前时间90天
         * @param startDate
         *            开始时间
         * @param endDate
         *            结束时间按
         * @param interval
         *            间隔数
         * @return
         */
        public static boolean isOverIntervalLimit(Date startDate, Date endDate, int interval) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(new Date());
            cal.add(Calendar.DAY_OF_MONTH, interval * (-1));
            Date curDate = getDayStart(cal.getTime());
            if (getDayStart(startDate).compareTo(curDate) < 0 || getDayStart(endDate).compareTo(curDate) < 0) {
                return true;
            }
            return false;
        }
    
        /**
         * 判断开始时间和结束时间,是否超出了当前时间的一定的间隔数限制, 时间单位默认为天数 如:开始时间和结束时间,不能超出距离当前时间90天
         * @param startDateStr
         *            开始时间
         * @param endDateStr
         *            结束时间按
         * @param interval
         *            间隔数
         * @return
         */
        public static boolean isOverIntervalLimit(String startDateStr, String endDateStr, int interval) {
            Date startDate = null;
            Date endDate = null;
            startDate = DateHelper.parseDate(startDateStr, DateHelper.DATE_FORMAT_DATEONLY);
            endDate = DateHelper.parseDate(endDateStr, DateHelper.DATE_FORMAT_DATEONLY);
            if (startDate == null || endDate == null){
                return true;
            }
            return isOverIntervalLimit(startDate, endDate, interval);
        }
    
        /**
         * 传入时间字符串及时间格式,返回对应的Date对象
         * @param src
         *            时间字符串
         * @param pattern
         *            时间格式
         * @return Date
         */
        public static Date getDateFromString(String src, String pattern) {
            SimpleDateFormat f = new SimpleDateFormat(pattern);
            try {
                return f.parse(src);
            } catch (ParseException e) {
                return null;
            }
        }
    
        /**
         * 取季度
         * @param date
         * @return
         */
        @SuppressWarnings("deprecation")
        public static int getQuarter(Date date) {
            if (date.getMonth() == 0 || date.getMonth() == 1 || date.getMonth() == 2) {
                return 1;
            } else if (date.getMonth() == 3 || date.getMonth() == 4 || date.getMonth() == 5) {
                return 2;
            } else if (date.getMonth() == 6 || date.getMonth() == 7 || date.getMonth() == 8) {
                return 3;
            } else if (date.getMonth() == 9 || date.getMonth() == 10 || date.getMonth() == 11) {
                return 4;
            } else {
                return 0;
    
            }
        }
    
        /**
         * 取得通用日期时间格式字符串
         * @param date
         * @return String
         */
        public static String formatDate(Date date) {
            if (date == null) {
                return "";
            }
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return dateFormat.format(date);
        }
    
        /**
         * 获取当日的日期格式串
         * 
         * @param
         * @return String
         */
        public static String today() {
            return formatDate(new Date(), "yyyy-MM-dd");
        }
    
        /**
         * 获取ymd 时间戳
         * @return
         */
        public static String todayYMD() {
            return formatDate(new Date(), "yyyyMMdd");
        }
    
        /**
         * 获取当前时间格式串
         * 
         * @param
         * @return String
         */
        public static String currentTime() {
            return formatDate(new Date(), "yyyyMMddhhmmssSSS");
        }
    
        /**
         * 取得指定日期格式的字符串
         * 
         * @param date
         * @return String
         */
        public static String formatDate(Date date, String format) {
            SimpleDateFormat dateFormat = new SimpleDateFormat(format);
            return dateFormat.format(date);
        }
    
        /**
         * 获取昨日的日期格式串
         * 
         * @return Date
         */
        public static String getYesterday() {
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -1);
            return formatDate(calendar.getTime(), "yyyy-MM-dd");
        }
    
        /**
         * 获取昨天的日期YMD
         * @return
         */
        public static String getYesterdayYMD() {
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -1);
            return formatDate(calendar.getTime(), "yyyyMMdd");
        }
    
        /**
         * 日期加中间杠
         * @return
         */
        public static String getYesterdaySlashYMD() {
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -1);
            return formatDate(calendar.getTime(), "yyyy-MM-dd");
        }
    
        /**
         * 获取date对应的ymd
         * @param date
         * @return
         */
        public static String dateStrYMD(Date date) {
            return formatDate(date, "yyyyMMdd");
        }
    
    
        /**
         * 判断当前时间是否在一定的时间范围内
         * 
         * @param startTime
         * @return boolean
         */
        public static boolean isInBetweenTimes(String startTime, String endTime) {
            Date nowTime = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            String time = sdf.format(nowTime);
            if (time.compareTo(startTime) >= 0 && time.compareTo(endTime) <= 0) {
                return true;
            } else {
                return false;
            }
        }
    
        /**
         * 字符转日期
         * 
         * @param dateStr
         * @return
         */
        public static Date getDateByStr(String dateStr) {
            SimpleDateFormat formatter = null;
            if (dateStr == null) {
                return null;
            } else if (dateStr.length() == 8) {
                formatter = new SimpleDateFormat("yyyyMMdd");
            }  else if (dateStr.length() == 10) {
                formatter = new SimpleDateFormat("yyyy-MM-dd");
            } else if (dateStr.length() == 16) {
                formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            } else if (dateStr.length() == 19) {
                formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            } else if (dateStr.length() > 19) {
                dateStr = dateStr.substring(0, 19);
                formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            }else {
                return null;
            }
            try {
                return formatter.parse(dateStr);
            } catch (ParseException e) {
                logger.error(e.getMessage());
                return null;
            }
        }
    
        /**
         * 根据传入的数字,输出相比现在days天的数据
         * 
         * @param days
         * @return Date
         */
        public static Date getDate(int days) {
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, days);
            return calendar.getTime();
        }
    
        /**
         * 日期最大时间
         * 
         * @param dt
         * @return
         */
        public static Date getMaxTime(Date dt) {
    
            Date dt1 = null;
            Calendar ca = Calendar.getInstance();
            ca.setTime(dt);
            ca.add(Calendar.DAY_OF_MONTH, 1);
            dt1 = ca.getTime();
            dt1 = DateHelper.getMinTime(dt1);
            ca.setTime(dt1);
            ca.add(Calendar.SECOND, -1);
            dt1 = ca.getTime();
            return dt1;
        }
    
        /**
         * 日期最小时间
         * 
         * @param dt
         * @return
         */
        public static Date getMinTime(Date dt) {
            Date dt1 = null;
            dt1 = DateHelper.getDateByStr(DateHelper.formatDate(dt, "yyyy-MM-dd"));
            return dt1;
        }
    
        /**
         * 月的最后一天
         * 
         * @param date
         * @return
         */
        @SuppressWarnings("deprecation")
        public static Date getLastDayOfMonth(Date date) {
            Calendar cDay1 = Calendar.getInstance();
            cDay1.setTime(date);
            int lastDay = cDay1.getActualMaximum(Calendar.DAY_OF_MONTH);
            Date lastDate = cDay1.getTime();
            lastDate.setDate(lastDay);
            return lastDate;
        }
    
        /**
         * 月的第一天
         * 
         * @param date
         * @return
         */
        public static Date getFirstDayOfMonth(Date date) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DATE));
            return calendar.getTime();
        }
    
        /**
         * 上月第一天
         * 
         * @return
         */
        public static Date getPreviousMonthFirstDay() {
            Calendar lastDate = Calendar.getInstance();
            // 设为当前月的1号
            lastDate.set(Calendar.DATE, 1);
            // 减一个月,变为下月的1号
            lastDate.add(Calendar.MONTH, -1);
            return getMinTime(lastDate.getTime());
        }
    
        /**
         * 上月最后一天
         * @return
         */
        public static Date getPreviousMonthLastDay() {
            Calendar lastDate = Calendar.getInstance();
            // 设为当前月的1号
            lastDate.set(Calendar.DATE, 1);
            lastDate.add(Calendar.DATE, -1);
            return getMinTime(lastDate.getTime());
        }
    
        /**
         * 两个日期相关天数
         * @param startDate
         * @param endDate
         * @return
         */
        public static long getDateDiff(String startDate, String endDate) {
            long diff = 0;
            try {
                Date date1 = new SimpleDateFormat("yyyy-MM-dd").parse(startDate);
                Date date2 = new SimpleDateFormat("yyyy-MM-dd").parse(endDate);
    
                diff = (date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000) > 0 ? (date1.getTime() - date2.getTime())
                        / (24 * 60 * 60 * 1000)
                        : (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000);
            } catch (ParseException e) {
            }
            return diff;
        }
    
        /**
         * 获取相差天数
         * @param startDate
         * @param endDate
         * @return
         */
        public static Integer getDateDiffDays(Date startDate, Date endDate) {
            if (startDate == null || endDate == null) {
                return 0;
            }
            Long days = (startDate.getTime() - endDate.getTime()) / (24 * 60 * 60 * 1000);
            return days.intValue();
        }
    
    
        /**
         * 返回天数
         * @param date1
         * @param date2
         * @return
         */
        public static long getDateDiff(Date date1, Date date2) {
            if (date1 == null || date2 == null) {
                return 0L;
            }
            long diff = (date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000) > 0 ? (date1.getTime() - date2
                    .getTime()) / (24 * 60 * 60 * 1000) : (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000);
            return diff;
        }
    
        /**
         * 判断两个时间的相差年数
         * @param date1
         * @param date2
         * @return
         */
        public static int getYearDiff(Date date1, Date date2){
            if (date1 == null || date2 == null) {
                return 0;
            }
            Calendar calendar1 = Calendar.getInstance();
            calendar1.setTime(date1);
            int year1 = calendar1.get(Calendar.YEAR);
            Calendar calendar2 = Calendar.getInstance();
            calendar2.setTime(date2);
            int year2 = calendar2.get(Calendar.YEAR);
            return Math.abs( year1 - year2);
        }
    
        /**
         * 获取两个时间的毫秒数
         * @param date1
         * @param date2
         * @return
         */
        public static long getTimeDiff(Date date1, Date date2){
            if (date1 == null || date1 == null) {
                return 0L;
            }
            long diff = (date1.getTime() - date2.getTime()) > 0 ? (date1.getTime() - date2
                    .getTime())  : (date2.getTime() - date1.getTime()) ;
            return diff;
        }
    
        /**
         * 判断两个时间是不是在一个周中
         * @param date
         * @return
         */
        public static boolean isSameWeekWithToday(Date date) {
            if (date == null) {
                return false;
            }
            // 0.先把Date类型的对象转换Calendar类型的对象
            Calendar todayCal = Calendar.getInstance();
            Calendar dateCal = Calendar.getInstance();
            todayCal.setTime(new Date());
            dateCal.setTime(date);
            int subYear = todayCal.get(Calendar.YEAR) - dateCal.get(Calendar.YEAR);
            // subYear==0,说明是同一年
            if (subYear == 0) {
                if (todayCal.get(Calendar.WEEK_OF_YEAR) == dateCal.get(Calendar.WEEK_OF_YEAR)) {
                    return true;
                }
            } else if (subYear == 1 && dateCal.get(Calendar.MONTH) == 11 && todayCal.get(Calendar.MONTH) == 0) {
                if (todayCal.get(Calendar.WEEK_OF_YEAR) == dateCal.get(Calendar.WEEK_OF_YEAR)) {
                    return true;
                }
            } else if (subYear == -1 && todayCal.get(Calendar.MONTH) == 11 && dateCal.get(Calendar.MONTH) == 0) {
                if (todayCal.get(Calendar.WEEK_OF_YEAR) == dateCal.get(Calendar.WEEK_OF_YEAR)) {
                    return true;
                }
            }
            return false;
        }
    
        /**
         * getStrFormTime: <br/>
         * 
         * @param form
         *            格式时间
         * @param date
         *            时间
         * @return
         */
        public static String getStrFormTime(String form, Date date) {
            SimpleDateFormat sdf = new SimpleDateFormat(form);
            return sdf.format(date);
        }
    
    
        /**
         *  获取几天内日期
         * @param countDay
         * @return
         */
        public static List<String> getLastDays(int countDay) {
            List<String> listDate = new ArrayList<String>();
            for (int i = 0; i < countDay; i++) {
                listDate.add(DateHelper.getReqDateyyyyMMdd(DateHelper.getDate(-i)));
            }
            return listDate;
        }
    
        /**
         * 对时间进行格式化
         * @param date
         * @return
         */
        public static Date dateFormat(Date date) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date value = new Date();
    
            try {
                value = sdf.parse(sdf.format(date));
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return value;
        }
    
    
        /**
         * 获取字符串 - yyyy-MM-dd
         * @param date
         * @return
         */
        public static String getDateStr_YMD(Date date) {
            return formatDate(date, "yyyy-MM-dd");
        }
    
    
        /**
         * isSameDayWithToday
         * @param date
         * @return
         */
        public static boolean isSameDayWithToday(Date date) {
            if (date == null) {
                return false;
            }
            Calendar todayCal = Calendar.getInstance();
            Calendar dateCal = Calendar.getInstance();
            todayCal.setTime(new Date());
            dateCal.setTime(date);
            int subYear = todayCal.get(Calendar.YEAR) - dateCal.get(Calendar.YEAR);
            int subMouth = todayCal.get(Calendar.MONTH) - dateCal.get(Calendar.MONTH);
            int subDay = todayCal.get(Calendar.DAY_OF_MONTH) - dateCal.get(Calendar.DAY_OF_MONTH);
            if (subYear == 0 && subMouth == 0 && subDay == 0) {
                return true;
            }
            return false;
        }
    
        /**
         * getDateByIndex
         * @param index  当前天数的范围
         * @return
         */
        public static Date getDateByIndex(int index) {
            Calendar ca = Calendar.getInstance();
            ca.add(5, index);
            return ca.getTime();
        }
    
        /**
         * getYmdByIndex 获取ymd Str
         * @param index  index 索引日期
         * @return
         */
        public static String getYmdByIndex(Integer index){
            Date indexDate = DateHelper.getDateByIndex(index);
            return DateHelper.dateStrYMD(indexDate);
        }
        
        /**
         * @Description: Just for test
         * @Autor: wu_bin - jasonandy@hotmail.com
         */
        public static void main(String[] args) {
            System.out.println(getPreviousMonthLastDay()); 
            System.out.println(getYesterday());
            System.out.println(getDateByIndex(-1));
            System.out.println(getDateByIndex(1));
            System.out.println(getDateByStr("2019-04-12"));
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:04DateUtils工具类

          本文链接:https://www.haomeiwen.com/subject/vefnrctx.html