java.util.Date日期时间工具类

import org.apache.commons.lang.StringUtils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类
 */

public class DateUtil {

    private final SimpleDateFormat format;

    public DateUtil(SimpleDateFormat format) {
        this.format = format;
    }

    public SimpleDateFormat getFormat() {
        return format;
    }

    //紧凑型日期格式,也就是纯数字类型yyyyMMdd
    public static final DateUtil COMPAT = new DateUtil(new SimpleDateFormat("yyyyMMdd"));

    //常用日期格式,yyyy-MM-dd
    public static final DateUtil COMMON = new DateUtil(new SimpleDateFormat("yyyy-MM-dd"));
    public static final DateUtil COMMON_FULL = new DateUtil(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    //使用斜线分隔的,西方多采用,yyyy/MM/dd
    public static final DateUtil SLASH = new DateUtil(new SimpleDateFormat("yyyy/MM/dd"));

    //中文日期格式常用,yyyy年MM月dd日
    public static final DateUtil CHINESE = new DateUtil(new SimpleDateFormat("yyyy年MM月dd日"));
    public static final DateUtil CHINESE_FULL = new DateUtil(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"));

    private final static SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
    private final static SimpleDateFormat sdfDays = new SimpleDateFormat("yyyyMMdd");
    private final static SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd");
    private final static SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM");
    private final static SimpleDateFormat sdfTimes = new SimpleDateFormat("yyyyMMddHHmmss");
    private final static SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private final static SimpleDateFormat sdfTimeMillis = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    private final static SimpleDateFormat sdfTimeMilli = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");


    private static int getDateField(Date date, int field) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(field);
    }

    /**
     * 日期获取字符串
     */
    public String getDateText(Date date) {
        return getFormat().format(date);
    }

    /**
     * 字符串获取日期
     *
     * @throws ParseException
     */
    public Date getTextDate(String text) throws ParseException {
        return getFormat().parse(text);
    }

    /**
     * 日期获取字符串
     */
    public static String getDateText(Date date, String format) {
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 字符串获取日期
     *
     * @throws ParseException
     */
    public static Date getTextDate(String dateText, String format) throws ParseException {
        return new SimpleDateFormat(format).parse(dateText);
    }

    /**
     * 根据日期,返回其星期数,周一为1,周日为7
     *
     * @param date
     * @return
     */
    public static int getWeekDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int w = calendar.get(Calendar.DAY_OF_WEEK);
        int ret;
        if (w == Calendar.SUNDAY)
            ret = 7;
        else
            ret = w - 1;
        return ret;
    }

    /**
     * 获取yyyyMMMddHHmmssSSS格式
     *
     * @return
     */
    public static String getTimeMillis() {
        return sdfTimeMillis.format(new Date());
    }

    /**
     * 获取yyyy-MMM-dd HH:mm:ss:SSS格式
     *
     * @return
     */
    public static String getTimeMilli() {
        return sdfTimeMilli.format(new Date());
    }

    /**
     * 获取YYYY格式
     *
     * @return
     */
    public static String getSdfTimes() {
        return sdfTimes.format(new Date());
    }

    /**
     * 获取YYYY格式
     *
     * @return
     */
    public static String getYear() {
        return sdfYear.format(new Date());
    }

    /**
     * 获取YYYY-MM-DD格式
     *
     * @return
     */
    public static String getDay() {
        return sdfDay.format(new Date());
    }

    /**
     * 获取YYYY-MM格式
     *
     * @return
     */
    public static String getMonth() {
        return sdfMonth.format(new Date());
    }

    /**
     * 获取YYYYMMDD格式
     *
     * @return
     */
    public static String getDays() {
        return sdfDays.format(new Date());
    }

    /**
     * 获取YYYY-MM-DD HH:mm:ss格式
     *
     * @return
     */
    public static String getTime() {
        return sdfTime.format(new Date());
    }

    /**
     * 获取指定格式的当前日期
     *
     * @return
     */
    public static String getFormatTime(String format) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        return simpleDateFormat.format(new Date());
    }

    /**
     * 将源日期转化为制定格式
     *
     * @param sourceTime   源时间
     * @param sourceFormat 源时间格式
     * @param targetFormat 转化后的时间格式
     * @return
     * @throws ParseException
     */
    public static String getFormatTime(String sourceTime, String sourceFormat,
                                       String targetFormat) throws ParseException {
        SimpleDateFormat sourceDateFormat = new SimpleDateFormat(sourceFormat);
        SimpleDateFormat targetDateFormat = new SimpleDateFormat(targetFormat);
        Date date = sourceDateFormat.parse(sourceTime);
        return targetDateFormat.format(date);
    }

    /**
     * @param s
     * @param e
     * @return boolean
     * @throws
     * @Title: compareDate
     * @Description: TODO(日期比较 , 如果s > = e 返回true 否则返回false)
     * @author fh
     */
    public static boolean compareDate(String s, String e) {
        if (fomatDate(s) == null || fomatDate(e) == null) {
            return false;
        }
        return fomatDate(s).getTime() >= fomatDate(e).getTime();
    }

    /**
     * 格式化日期
     *
     * @return
     */
    public static Date fomatDate(String date) {
        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return fmt.parse(date);
        } catch (ParseException e) {
//            e.printStackTrace();
            return null;
        }
    }

    /**
     * 校验日期是否合法
     *
     * @return
     */
    public static boolean isValidDate(String s) {
        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        try {
            fmt.parse(s);
            return true;
        } catch (Exception e) {
            // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
            return false;
        }
    }

    /**
     * @param startTime
     * @param endTime
     * @return
     */
    public static int getDiffYear(String startTime, String endTime) {
        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        try {
            //long aa=0;
            int years = (int) (((fmt.parse(endTime).getTime() - fmt.parse(startTime).getTime()) / (1000 * 60 * 60 * 24)) / 365);
            return years;
        } catch (Exception e) {
            // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
            return 0;
        }
    }

    /**
     * <li>功能描述:时间相减得到天数
     *
     * @param beginDateStr
     * @param endDateStr
     * @return long
     * @author Administrator
     */
    public static long getDaySub(String beginDateStr, String endDateStr) {
        long day = 0;
        java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
        java.util.Date beginDate = null;
        java.util.Date endDate = null;

        try {
            beginDate = format.parse(beginDateStr);
            endDate = format.parse(endDateStr);
        } catch (ParseException e) {
//            e.printStackTrace();
        }
        day = (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
        //System.out.println("相隔的天数="+day);

        return day;
    }

    /**
     * 计算2个日期之间相差的  以年、月、日为单位,各自计算结果是多少
     * 比如:2011-02-02 到  2017-03-02
     *
     * @param beginDateStr
     * @param endDateStr
     * @return
     * @throws ParseException
     */
    public static int getMonthDiffer(String beginDateStr, String endDateStr) throws ParseException {
        java.util.Date beginDate = null;
        java.util.Date endDate = null;
        java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM");
        beginDate = format.parse(beginDateStr);
        endDate = format.parse(endDateStr);

        int from = getDateField(beginDate, Calendar.YEAR) * 12 - getDateField(beginDate, Calendar.MONTH);
        int to = getDateField(endDate, Calendar.YEAR) * 12 - getDateField(endDate, Calendar.MONTH);

        return to - from;
    }

    /**
     * 获取两个时间的 年份 或 月份 或 星期 或 天数 差值
     * @param start 起始日期
     * @param end   结束日期
     * @param type  差值计算类型  Calendar.YEAR:年份 Calendar.MONTH:推算  Calendar.DATE:推算
     * @return
     */
    public static int getDifferBetweenDate(Date start, Date end, Integer type) {
        type = type == null ? Calendar.DATE : type;

        if (start.getTime() > end.getTime()) {
            Date temp = start;
            start = end;
            end = temp;
        }

        if (Calendar.DATE == type)
            return (int) ((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
        else if (Calendar.MONTH == type) {
            int from = getDateField(start, Calendar.YEAR) * 12 - getDateField(start, Calendar.MONTH);
            int to = getDateField(end, Calendar.YEAR) * 12 - getDateField(end, Calendar.MONTH);
            return to - from;
        }

        return getDateField(end, type) - getDateField(start, type);
    }

    /**
     * 获取两个时间的 年份 或 月份 或 星期 或 天数 差值
     * @param startStr 起始日期字符串(yyyy-MM-dd)格式
     * @param endStr   结束日期字符串(yyyy-MM-dd)格式
     * @param type     差值计算类型  Calendar.YEAR:年份 Calendar.MONTH:推算  Calendar.WEEK_OF_YEAR:星期  Calendar.DATE:推算
     * @return
     */
    public static int getDifferBetweenDate(String startStr, String endStr, Integer type) throws Exception {
        java.util.Date end = new Date();
        java.util.Date start = new Date();
        java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");

        if (StringUtils.isNotBlank(startStr))
            start = format.parse(startStr);

        if (StringUtils.isNotBlank(endStr))
            end = format.parse(endStr);

        return getDifferBetweenDate(start, end, type);
    }

    /**
     * 根据指定开始年月,获取指定日期 formatStr(自定义) 字符串
     *
     * @param startStr  计算开始日期时间字符串(yyyy-MM-dd)格式,该字段为空时则以当前时间开始计算
     * @param type      计算类型 Calendar.YEAR:年份推算  Calendar.MONTH:推算月份  Calendar.DATE:推算日期
     * @param nums      推算长度 大于0:往后推算  小于0:往前推算
     * @param formatStr 需要得到的结果字符串日期时间格式,该字段为空时返回yyyy-MM-dd格式字符串
     * @return 获取startStr开始nums长度后的formatStr格式的日期时间字符串,monthStr、formatStr为空时以当前时间开始返回yyyy-MM-dd格式的年月字符串
     * @throws Exception
     */
    public static String getAssignDate(String startStr, Integer type, Integer nums, String formatStr) throws Exception {
        Calendar rightNow = Calendar.getInstance();

        if (StringUtils.isNotBlank(startStr)) {
            java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
            java.util.Date beginDate = format.parse(startStr);
            rightNow.setTime(beginDate);
        }

        rightNow.add(type == null ? Calendar.MONTH : type, nums == null ? 0 : nums);
        //  rightNow.add(Calendar.YEAR,-1);//日期减1年
        //  rightNow.add(Calendar.MONTH, nums);//日期加3个月
        //  rightNow.add(Calendar.DAY_OF_YEAR,5);//日期加5天

        return getDateFormatStr(StringUtils.isBlank(formatStr) ? "yyyy-MM-dd" : formatStr, rightNow.getTime());
    }

    /**
     * 得到n天之后的日期 formatStr(自定义) 格式,默认(format为空)返回(yyyy-MM-dd)格式
     *
     * @param days 推算天数  大于0:往后推算  小于0:往前推算
     * @return formatStr格式的日期时间字符串,formatStr为空时返回yyyy-MM-dd格式
     */
    public static String getAfterDayDate(String days, String formatStr) {
        int daysInt = Integer.parseInt(days);

        Calendar canlendar = Calendar.getInstance(); // java.util包
        canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动

        return getDateFormatStr(StringUtils.isBlank(formatStr) ? "yyyy-MM-dd" : formatStr, canlendar.getTime());
    }

    /**
     * 得到n个月之后的日期 formatStr(自定义) 格式,默认(formatStr为空)返回(yyyy-MM)格式
     *
     * @param months 推算月份  大于0:往后推算  小于0:往前推算
     * @return formatStr格式的日期时间字符串,formatStr为空时返回yyyy-MM格式
     */
    public static String getAfterMonthDate(String months, String formatStr) {
        int monthsInt = Integer.parseInt(months);

        Calendar canlendar = Calendar.getInstance(); // java.util包
        canlendar.add(Calendar.MONTH, monthsInt); // 日期减 如果不够减会将月变动

        return getDateFormatStr(StringUtils.isBlank(formatStr) ? "yyyy-MM" : formatStr, canlendar.getTime());
    }

    /**
     * 得到n天之后是周几
     *
     * @param days
     * @return
     */
    public static String getAfterDayWeek(String days) {
        int daysInt = Integer.parseInt(days);
        Calendar canlendar = Calendar.getInstance(); // java.util包
        canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动

        return getDateFormatStr("E", canlendar.getTime());
    }

    private static String getDateFormatStr(String formatStr, Date date) {
        SimpleDateFormat sdfd = new SimpleDateFormat(formatStr);
        return sdfd.format(date);
    }

    public static void main(String[] args) throws Exception {
        System.out.println(DateUtil.getDifferBetweenDate("2016-05-01", "2018-05-03", Calendar.YEAR));
        System.out.println(DateUtil.getDifferBetweenDate("2016-05-01", "2012-05-03", Calendar.MONTH));
        System.out.println(DateUtil.getMonthDiffer("2016-05-01", "2012-05-03"));
        System.out.println(DateUtil.getDifferBetweenDate("2016-05-01", "2018-05-03", Calendar.WEEK_OF_YEAR));
        System.out.println(DateUtil.getDifferBetweenDate("2016-05-01", "2018-05-03", Calendar.DATE));
    }

}
原文地址:https://www.cnblogs.com/jindao3691/p/15307900.html