DateUtils工具类

Posted paranoidcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DateUtils工具类相关的知识,希望对你有一定的参考价值。

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

/**
 * Date的通用工具类
 *
 * @author ParanoidCAT
 * @since JDK 1.8
 */
public class DateUtils {
    /**
     * 常量池
     * DateFormat内部使用Calendar做缓存
     * 并发不安全,因此常量池不保存DateFormat实例而是保存pattern字符串
     * <p>
     * 每次都实例化新的SimpleDateFormat会有一定的额外开销
     * 但比起数据安全来说是值得的
     *
     * @see java.text.DateFormat
     */
    public static final String DATE_PATTERN = "yyyy-MM-dd";
    public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_TIME_MILLISECOND_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
    public static final String[] PATTERNS = {
            DATE_PATTERN, DATE_TIME_PATTERN, DATE_TIME_MILLISECOND_PATTERN
    };

    /**
     * 根据默认格式化模板datePattern将Date格式化为String
     * 默认格式化模板为"yyyy-MM-dd HH:mm:ss"
     *
     * @param date 待格式化的Date
     * @return java.lang.String
     */
    public static String format(Date date) {
        return format(date, DATE_TIME_PATTERN);
    }

    /**
     * 根据指定的格式化模板datePattern将Date格式化为String
     * 若指定的格式化模板为empty,使用默认格式化模板
     *
     * @param date        待格式化的Date
     * @param datePattern 指定的格式化模板
     * @return java.lang.String
     */
    public static String format(Date date, String datePattern) {
        if (null == date) {
            return null;
        }
        if (null == datePattern || datePattern.trim().length() <= 0) {
            return format(date);
        }
        return new SimpleDateFormat(datePattern).format(date);
    }

    /**
     * 根据指定的解析模板datePattern将String解析为Date
     *
     * @param dateString  待解析的String
     * @param datePattern 指定的解析模板
     * @return java.utils.Date
     */
    public static Date parse(String dateString, String datePattern) {
        if (null == dateString || dateString.trim().length() <= 0 || null == datePattern || datePattern.trim().length() <= 0) {
            return null;
        }
        try {
            DateFormat dateFormat = new SimpleDateFormat(datePattern);
            Date date = dateFormat.parse(dateString);
            // 注意,这里在完成解析后必须反向格式化进行校验才可以返回
            if (dateString.equals(dateFormat.format(date))) {
                return date;
            } else {
                return null;
            }
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 根据一系列解析模板datePatterns将String解析为Date
     *
     * @param dateString   待解析的String
     * @param datePatterns 一系列解析模板
     * @return java.utils.Date
     */
    public static Date parse(String dateString, String[] datePatterns) {
        if (null == dateString || dateString.trim().length() <= 0 || null == datePatterns) {
            return null;
        }
        Date date = null;
        for (String datePattern : datePatterns) {
            if (null == date) {
                date = parse(dateString, datePattern);
            }
        }
        return date;
    }

    /**
     * 对Date进行变更的方法
     * 内部使用Calendar实现
     * 私有方法,只有date和amount为外部传入
     * 为避免amount的形参为int时实参为null自动拆箱即抛出NullPointException(此时未进入方法无法捕获),使用Integer作为形参,在内部处理
     *
     * @param date          待变更的Date
     * @param calendarField Calendar的字段编号
     * @param amount        变更的数量(正数为增加负数为减少)
     * @return java.utils.Date
     */
    private static Date add(Date date, int calendarField, Integer amount) {
        if (null == date) {
            return null;
        }
        if (null == amount) {
            return date;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendarField, amount);
        return calendar.getTime();
    }

    /**
     * 变更Date的年
     *
     * @param date   待变更的Date
     * @param amount 变更的数量(正数为增加负数为减少)
     * @return java.utils.Date
     */
    public static Date addYears(Date date, Integer amount) {
        return add(date, Calendar.YEAR, amount);
    }

    /**
     * 变更Date的月
     *
     * @param date   待变更的Date
     * @param amount 变更的数量(正数为增加负数为减少)
     * @return java.utils.Date
     */
    public static Date addMonths(Date date, Integer amount) {
        return add(date, Calendar.MONTH, amount);
    }

    /**
     * 变更Date的日期
     *
     * @param date   待变更的Date
     * @param amount 变更的数量(正数为增加负数为减少)
     * @return java.utils.Date
     */
    public static Date addDays(Date date, Integer amount) {
        return add(date, Calendar.DATE, amount);
    }

    /**
     * 变更Date的小时
     *
     * @param date   待变更的Date
     * @param amount 变更的数量(正数为增加负数为减少)
     * @return java.utils.Date
     */
    public static Date addHours(Date date, Integer amount) {
        return add(date, Calendar.HOUR_OF_DAY, amount);
    }

    /**
     * 变更Date的分钟
     *
     * @param date   待变更的Date
     * @param amount 变更的数量(正数为增加负数为减少)
     * @return java.utils.Date
     */
    public static Date addMinutes(Date date, Integer amount) {
        return add(date, Calendar.MINUTE, amount);
    }

    /**
     * 变更Date的秒
     *
     * @param date   待变更的Date
     * @param amount 变更的数量(正数为增加负数为减少)
     * @return java.utils.Date
     */
    public static Date addSeconds(Date date, Integer amount) {
        return add(date, Calendar.SECOND, amount);
    }

    /**
     * 变更Date的毫秒
     *
     * @param date   待变更的Date
     * @param amount 变更的数量(正数为增加负数为减少)
     * @return java.utils.Date
     */
    public static Date addMilliseconds(Date date, Integer amount) {
        return add(date, Calendar.MILLISECOND, amount);
    }

    /**
     * 变更Date的时间为0时0分0秒
     *
     * @param date 待变更的Date
     * @return java.utils.Date
     */
    public static Date startTimeOfDate(Date date) {
        if (null == date) {
            return null;
        }
        return parse(format(date, DATE_PATTERN) + " 00:00:00.000", DATE_TIME_MILLISECOND_PATTERN);
    }

    /**
     * 变更Date的时间为23时59分59秒
     *
     * @param date 待变更的Date
     * @return java.utils.Date
     */
    public static Date endTimeOfDate(Date date) {
        if (null == date) {
            return null;
        }
        return parse(format(date, DATE_PATTERN) + " 23:59:59.999", DATE_TIME_MILLISECOND_PATTERN);
    }
}

 

以上是关于DateUtils工具类的主要内容,如果未能解决你的问题,请参考以下文章

DateUtils 工具类方法汇总

DateUtils 时间工具类

日期工具类 DateUtils(继承org.apache.commons.lang.time.DateUtils类)

DateUtils工具类

DateUtils工具类

DateUtils 工具类