日期工具类

import java.sql.Time;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.joda.time.DateTime;
import org.joda.time.Minutes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DateUtil {

    /** LOGGER */
    private static final Logger LOGGER = LoggerFactory.getLogger(DateUtil.class);

    /** 完整时间 yyyy-MM-dd HH:mm:ss */
    public static final String SIMPLE = "yyyy-MM-dd HH:mm:ss";

    /** 完整时间 yyyy-MM-dd HH:mm:ss,SSS */
    public static final String SIMPLEMS = "yyyy-MM-dd HH:mm:ss,SSS";

    /** 年月日 yyyy-MM-dd */
    public static final String DTSIMPLE = "yyyy-MM-dd";

    /** 年月日(中文) yyyy年MM月dd日 */
    public static final String DTSIMPLECHINESE = "yyyy年MM月dd日";

    /** 年月日(无下划线) yyyyMMdd */
    public static final String DTMONTH = "yyyyMM";

    /** 年月日(无下划线) yyyyMMdd */
    public static final String DTSHORT = "yyyyMMdd";

    /** 年月日时(无下划线) yyyyMMddHH */
    public static final String DTHOUR = "yyyyMMddHH";

    /** 年月日时分(无下划线) yyyyMMddHHmm */
    public static final String DTMIDDLE = "yyyyMMddHHmm";

    /** 年月日时分秒(无下划线) yyyyMMddHHmmss */
    public static final String DTLONG = "yyyyMMddHHmmss";

    /** 时分秒 HH:mm:ss */
    public static final String HMSFORMAT = "HH:mm:ss";

    /** 时分 HH:mm */
    public static final String HMFORMAT = "HH:mm";

    /** 年-月-日 小时:分钟 yyyy-MM-dd HH:mm */
    public static final String SIMPLEFORMAT = "yyyy-MM-dd HH:mm";

    /** 年月日(中文) yyyy年MM月dd日 HH:mm */
    public static final String DTSIMPLECHINESEWITHTIME = "yyyy年MM月dd日 HH:mm";

    /** 年月日(中文) yyyy年MM月dd日 HH:mm:ss */
    public static final String DTSIMPLECHINESEWITHTIMESECOND = "yyyy年MM月dd日 HH:mm:ss";

    /** 年月日   , yyyy.MM.dd */
    public static final String DTSIMPLEBY = "yyyy.MM.dd";

    /** 月日  ,MMdd */
    public static final String MONTHDAY = "MMdd";

    /**
     * 获取格式
     *
     * @param format 格式
     * @return 获取格式
     */
    public static final DateFormat getFormat(String format) {
        return new SimpleDateFormat(format);
    }

    /**
     * yyyy-MM-dd HH:mm:ss,SSS
     *
     * @param date 日期格式
     * @return 获取日期类型String
     */
    public static final String simplemsFormat(Date date) {
        if (date == null) {
            return "";
        }
        return getFormat(SIMPLEMS).format(date);
    }

    /**
     * HH:mm
     *
     * @param date 日期格式
     * @return 获取日期类型String
     */
    public static final String hmFormat(Date date) {
        if (date == null) {
            return "";
        }
        return getFormat(HMFORMAT).format(date);
    }

    /**
     * yyyy-MM-dd HH:mm:ss
     *
     * @param date 日期
     * @return 日期String值
     */
    public static final String simpleFormat(Date date) {
        if (date == null) {
            return "";
        }
        return getFormat(SIMPLE).format(date);
    }

    /**
     * yyyy-MM-dd
     *
     * @param date 日期
     * @return 日期String值
     */
    public static final String dtSimpleFormat(Date date) {
        if (date == null) {
            return "";
        }
        return getFormat(DTSIMPLE).format(date);
    }

    /**
     * HH:mm:ss
     *
     * @param time 时间
     * @return 时间String值
     */
    public static final String simpleFormat(Time time) {
        if (time == null) {
            return "";
        }
        return getFormat(HMSFORMAT).format(time);
    }

    /**
     * yyyyMMdd
     *
     * @param date 日期
     * @return 日期String值
     */
    public static final String dtShortSimpleFormat(Date date) {
        if (date == null) {
            return "";
        }
        return getFormat(DTSHORT).format(date);
    }

    /**
     * <pre>
     *  yyyyMMddHHmm
     * </pre>
     *
     * @param date 日期
     * @return 日期String值
     */
    public static final String dtMiddleSimpleFormat(Date date) {
        if (date == null) {
            return "";
        }
        return getFormat(DTMIDDLE).format(date);
    }

    /**
     * <pre>
     *  yyyyMMddHHmmss
     * </pre>
     *
     * @param date 日期
     * @return 日期String值
     */
    public static final String dtLongSimpleFormat(Date date) {
        if (date == null) {
            return "";
        }
        return getFormat(DTLONG).format(date);
    }

    /**
     * <pre>
     * 获取日期String值
     * </pre>
     *
     * @param strDate yyyyMMdd 日期
     * @return yyyy-MM-dd 日期String值
     */
    public static final String dtFromShortToSimpleStr(String strDate) {
        if (null != strDate) {
            Date date;
            try {
                date = shortstring2Date(strDate);
            } catch (ParseException e) {
                date = null;
            }
            if (null != date) {
                return dtSimpleFormat(date);
            }
        }
        return "";
    }

    /**
     * yyyy-mm-dd 日期格式转换为日期
     *
     * @param strDate 日期String值
     * @return 日期对象
     */
    public static final Date strToDtSimpleFormat(String strDate) {
        if (strDate == null) {
            return null;
        }

        try {
            return getFormat(DTSIMPLE).parse(strDate);
        } catch (Exception e) {
            LOGGER.error("格式化日期(strToDtSimpleFormat)异常。strDate={0}", strDate, e);
        }

        return null;
    }

    /**
     * yyyy年MM月dd日
     *
     * @param date 日期对象
     * @return 日期String值
     */
    public static final String dtSimpleChineseFormat(Date date) {
        if (date == null) {
            return "";
        }

        return getFormat(DTSIMPLECHINESE).format(date);
    }

    /**
     * yyyy-MM-dd到 yyyy年MM月dd日 转换
     *
     * @param date 日期String值 yyyy-MM-dd格式
     * @return 日期String值  yyyy年MM月dd日格式
     */
    public static final String dtSimpleChineseFormatStr(String date) throws ParseException {
        if (date == null) {
            return "";
        }

        return getFormat(DTSIMPLECHINESE).format(string2Date(date));
    }

    /**
     * yyyy-MM-dd 日期字符转换为时间
     *
     * @param stringDate Sting类型的日期格式
     * @return 日期类型
     * @throws ParseException
     */
    public static final Date string2Date(String stringDate) throws ParseException {
        if (stringDate == null) {
            return null;
        }

        return getFormat(DTSIMPLE).parse(stringDate);
    }

    /**
     * 返回日期时间(Add by Sunzy)
     *
     * @param stringDate "yyyy-MM-dd HH:mm:ss"
     * @return 日期类型
     * @throws ParseException
     */
    public static final Date string2DateTime(String stringDate) {
        try {
            if (stringDate == null) {
                return null;
            }

            return getFormat(SIMPLE).parse(stringDate);
        } catch (Exception e) {
            LOGGER.error("[DateUtil.string2DateTime] error!", e);
        }
        return null;
    }

    /**
     * 返回日期时间
     *
     * @param stringDate "yyyy-MM-dd HH:mm"
     * @return 日期类型
     * @throws ParseException
     */
    public static final Date withoutSencendString2DateTime(String stringDate) throws ParseException {
        if (stringDate == null) {
            return null;
        }

        return getFormat(SIMPLEFORMAT).parse(stringDate);
    }

    /**
     * 返回日期时间(Add by Gonglei)
     *
     * @param stringDate (yyyyMMdd)格式日期
     * @return 日期对象
     * @throws ParseException
     */
    public static Date shortstring2Date(String stringDate) throws ParseException {
        if (stringDate == null) {
            return null;
        }

        return getFormat(DTSHORT).parse(stringDate);
    }

    /**
     * 返回短日期格式(yyyyMMdd格式)
     *
     * @param date 日期格式对象
     * @return 日期对象
     * @throws ParseException
     */
    public static String shortDate(Date date) {
        if (date == null) {
            return null;
        }

        return getFormat(DTSHORT).format(date);
    }

    /**
     * 返回长日期格式(yyyyMMddHHmmss格式)
     *
     * @param date 日期信息
     * @return String格式日期
     * @throws ParseException
     */
    public static String longDate(Date date) {
        if (date == null) {
            return null;
        }

        return getFormat(DTLONG).format(date);
    }

    /**
     * 计算当前时间几小时之后的时间
     *
     * @param date  日期信息
     * @param hours 小时信息
     * @return 日期格式信息
     */
    public static Date addHours(Date date, long hours) {
        return addMinutes(date, hours * 60);
    }

    /**
     * 计算当前时间几分钟之后的时间
     *
     * @param date    日期信息
     * @param minutes 分钟信息
     * @return 日期信息
     */
    public static Date addMinutes(Date date, long minutes) {
        return addSeconds(date, minutes * 60);
    }

    /**
     * 计算当前时间几秒钟之后的时间
     *
     * @param date 日期信息
     * @param secs 秒信息
     * @return 日期信息
     */

    public static Date addSeconds(Date date, long secs) {
        return new Date(date.getTime() + (secs * 1000));
    }

    /**
     * 返回日期相差天数,向下取整数
     *
     * @param dateStart 一般前者小于后者dateEnd
     * @param dateEnd   截止时间
     * @return 两者相差天数
     */
    public static int countDays(Date dateStart, Date dateEnd) {
        if ((dateStart == null) || (dateEnd == null)) {
            return -1;
        }

        return (int)((dateEnd.getTime() - dateStart.getTime()) / (1000 * 60 * 60 * 24));
    }

    /**
     * 返回日期相差完整天数,不向下取整
     *
     * @param dateStart 开始日期
     * @param dateEnd   结束日期
     * @return 日期相差天数
     */
    public static final int countCompleteDays(Date dateStart, Date dateEnd) {
        if ((dateStart == null) || (dateEnd == null)) {
            return -1;
        }
        Date formatDateStart = null, formatDateEnd = null;
        try {
            formatDateStart = shortstring2Date(dtShortSimpleFormat(dateStart));
            formatDateEnd = shortstring2Date(dtShortSimpleFormat(dateEnd));
        } catch (ParseException e) {
            LOGGER.error("格式化日期(countCompleteDays)异常。dateStart={0}, dateEnd={1}", dateStart, dateEnd, e);
            return -1;
        }

        return countDays(formatDateStart, formatDateEnd);
    }

    /**
     * 将字符串按format格式转换为date类型
     *
     * @param str    日期String值
     * @param format 日期格式
     * @return 日期信息
     */
    public static Date string2Date(String str, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);

        try {
            return sdf.parse(str);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 加减天数
     *
     * @param aDate 日期
     * @param days  天数
     * @return 日期信息
     */
    public static Date increaseDate(Date aDate, int days) {
        Calendar cal = Calendar.getInstance();

        cal.setTime(aDate);
        cal.add(Calendar.DAY_OF_MONTH, days);
        return cal.getTime();
    }

    /**
     * 年月日(中文) yyyy年MM月dd日 HH:mm:ss
     *
     * @param date 日期信息
     * @return 日期字符串值
     */
    public static final String dtSimpleChineseFormatWithTimeSecond(Date date) {
        if (date == null) {
            return "";
        }
        return getFormat(DTSIMPLECHINESEWITHTIMESECOND).format(date);
    }

    /**
     * 计算当前时间后几个天的时间.
     *
     * @param date 当前时间.
     * @param days 天数.
     * @return 当前时间后几个天的时间.
     */
    public static Date addDays(final Date date, final int days) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        //化整为零,化一天为24小时
        final int hour = 24;
        calendar.add(Calendar.HOUR, days * hour);
        return calendar.getTime();
    }

    /**
     * 计算当前时间后几个年的时间.
     *
     * @param date  当前时间.
     * @param years 年数.
     * @return 当前时间后几个年的时间.
     */
    public static Date addYears(final Date date, final int years) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, years);
        return calendar.getTime();
    }

    /**
     * 据出生日期计算年龄("yyyy-MM-dd").
     *
     * @param strBirthDay 字符串格式的出生日期.
     * @return 年龄.
     * @throws Exception 系统异常.
     */
    public static int getAgeByBirthday(final String strBirthDay) throws Exception {
        return getAgeByBirthday(strBirthDay, DTSIMPLE);
    }

    /**
     * 根据出生日期计算年龄.
     *
     * @param strBirthDay 字符串型日期.
     * @param format      日期格式.
     * @return 未来日期返回0.
     * @throws Exception 系统异常.
     */
    public static int getAgeByBirthday(final String strBirthDay, final String format) throws Exception {
        DateFormat dateFormat = new SimpleDateFormat(format);
        Date birthDay = dateFormat.parse(strBirthDay);
        return getAgeByBirthday(birthDay);
    }

    /**
     * 根据出生日期计算年龄.
     *
     * @param birthDay 出生日期.
     * @return 年龄(未来日期返回0).
     * @throws Exception 系统异常.
     */
    public static int getAgeByBirthday(final Date birthDay) throws Exception {

        Calendar cal = Calendar.getInstance();

        if (cal.before(birthDay)) {
            return 0;
        }

        int yearNow = cal.get(Calendar.YEAR);
        int monthNow = cal.get(Calendar.MONTH);
        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
        cal.setTime(birthDay);

        int yearBirth = cal.get(Calendar.YEAR);
        int monthBirth = cal.get(Calendar.MONTH);
        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);

        int age = yearNow - yearBirth;

        if (monthNow <= monthBirth) {
            if (monthNow == monthBirth) {
                if (dayOfMonthNow < dayOfMonthBirth) {
                    age--;
                }
            } else {
                age--;
            }
        }

        return age;
    }

    /**
     * 转换成yyy.MM.dd
     *
     * @param date 日期信息
     * @return String格式日期信息
     */
    public static String getWebDateString(Date date) {
        DateFormat dateFormat = new SimpleDateFormat(DTSIMPLEBY);
        if (date == null) {
            return "";
        }
        return dateFormat.format(date);
    }

    /**
     * 将YYYYMMDD 转换成 YYYY.MM.DD
     *
     * @param dateString 日期信息
     * @return String值
     */
    public static String convert2WebFormat(String dateString) {
        DateFormat df1 = new SimpleDateFormat(DTSHORT);
        DateFormat df2 = new SimpleDateFormat(DTSIMPLEBY);

        return convert(dateString, df1, df2);
    }

    /**
     * Convert 转换方法
     *
     * @param dateString 日期String值
     * @param formatIn   起始类型
     * @param formatOut  目标类型
     * @return 返回日期格式
     */
    public static String convert(String dateString, DateFormat formatIn, DateFormat formatOut) {
        try {
            Date date = formatIn.parse(dateString);

            return formatOut.format(date);
        } catch (ParseException e) {
            LOGGER.error("格式化日期(convert)异常。dateString={0},formatIn={1},formatOut={2}", dateString, formatIn, formatOut,
                    e);
            return "";
        }
    }

    /**
     * 比当前时间要晚
     *
     * @param date 需要比较的日期
     * @return 是否比当前时间晚
     */
    public static boolean isAfterNow(Date date) {
        try {
            if (date == null) {
                return false;
            }
            DateFormat df1 = new SimpleDateFormat(DTSHORT);
            Date nowdate = df1.parse(df1.format(new Date()));
            return date.compareTo(nowdate) <= 0;
        } catch (Exception e) {
            LOGGER.error("日期格式转换(isAfterNow)异常。date={0}", date, e);
            throw new RuntimeException("isAfterNow:日期格式转换异常", e);
        }
    }

    /**
     * MMdd
     *
     * @param date 日期信息
     * @return 日期String值
     */
    public static String dtSimpleFormatMD(Date date) {
        if (date == null) {
            return "";
        }
        return getFormat(MONTHDAY).format(date);
    }

    /**
     * 返回日期时间
     *
     * @param stringDate (yyyyMMddHHmmss)
     * @return 日期信息
     * @throws ParseException
     */
    public static Date shortStringToDate(String stringDate) {
        try {
            if (stringDate == null) {
                return null;
            }
            return getFormat(DTLONG).parse(stringDate);
        } catch (Exception e) {

            return null;
        }
    }

    /**
     * 拿到昨天0点的时间
     *
     * @return
     */
    public static Date getYesterday() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DAY_OF_YEAR, -1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar.getTime();
    }

    /**
     * 拿到当天0点的时间
     *
     * @return
     */
    public static Date getToday() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar.getTime();
    }

    /**
     * 拿到明天0点的时间
     *
     * @return
     */
    public static Date getTomorrow() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DAY_OF_YEAR, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar.getTime();
    }

    /**
     * @return 返回当天的结束时间
     */
    public static Date getEndTime() {
        Calendar todayEnd = Calendar.getInstance();
        todayEnd.set(Calendar.HOUR_OF_DAY, 23);
        todayEnd.set(Calendar.MINUTE, 59);
        todayEnd.set(Calendar.SECOND, 58);
        return todayEnd.getTime();
    }

    /**
     * @return 返回当天的结束时间
     */
    public static Date getEndTime(int hh, int mm, int ss) {
        Calendar todayEnd = Calendar.getInstance();
        todayEnd.set(Calendar.HOUR_OF_DAY, hh);
        todayEnd.set(Calendar.MINUTE, mm);
        todayEnd.set(Calendar.SECOND, ss);
        return todayEnd.getTime();
    }

    public static Date getLastTime() {
        Calendar todayEnd = Calendar.getInstance();
        todayEnd.set(Calendar.HOUR_OF_DAY, 23);
        todayEnd.set(Calendar.MINUTE, 59);
        todayEnd.set(Calendar.SECOND, 59);
        return todayEnd.getTime();
    }

    /**
     * @return 返回第二天的结束时间
     */
    public static Date getTomorrowEndTime() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DAY_OF_YEAR, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 58);
        return calendar.getTime();
    }

    /**
     * 获取某一天的开始时间
     *
     * @param increase 时间增量。0:当天;1:明天;2:后天。以此类推
     * @return
     */
    public static Date getSpecifyDayStartTime(int increase) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DAY_OF_YEAR, increase);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar.getTime();
    }

    /**
     * 获取某一天的结束时间
     *
     * @param increase 时间增量。0:当天;1:明天;2:后天。以此类推
     * @return
     */
    public static Date getSpecifyDayEndTime(int increase) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DAY_OF_YEAR, increase);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 58);
        return calendar.getTime();
    }

    public static Date getStartDate(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();
    }

    public static Date getEndDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar.getTime();
    }

    public static Long subDate2Time(Date date) {
        if (null == date) {
            return null;
        }

        SimpleDateFormat format = new SimpleDateFormat(HMSFORMAT);
        String hms = format.format(date);

        try {
            return format.parse(hms).getTime();
        } catch (ParseException e) {
            return null;
        }
    }

    public static int dateBetweenMinute(Date start, Date end) {
        DateTime startTime = new DateTime(start);
        DateTime endTime = new DateTime(end);
        return Minutes.minutesBetween(startTime, endTime).getMinutes();
    }

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值