最好用的Date工具类

Posted SDingBa

tags:

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

import com.google.common.collect.ImmutableMap;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.text.ParseException;
import java.util.*;
import java.util.regex.Pattern;

/**
 * 日期工具类, 通过静态继承的方式, 扩展common-lang3中的DateUtils
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils 

    private static final Map<Pattern, String> PATTERN_MAP = ImmutableMap.<Pattern, String>builder()
            .put(Pattern.compile("^\\\\d8$"), "yyyyMMdd")
            .put(Pattern.compile("^\\\\d14$"), "yyyyMMddHHmmss")
            .put(Pattern.compile("^\\\\d12$"), "yyyyMMddHHmm")
            .put(Pattern.compile("^\\\\d10$"), "yyyyMMddHH")
            .put(Pattern.compile("^\\\\d4\\\\-\\\\d1,2\\\\-\\\\d1,2 \\\\d1,2:\\\\d1,2:\\\\d1,2\\\\.\\\\d1,3$"), "y-M-d H:m:s.S")
            .put(Pattern.compile("^\\\\d4\\\\-\\\\d1,2\\\\-\\\\d1,2 \\\\d1,2:\\\\d1,2:\\\\d1,2$"), "y-M-d H:m:s")
            .put(Pattern.compile("^\\\\d4\\\\-\\\\d1,2\\\\-\\\\d1,2 \\\\d1,2:\\\\d1,2$"), "y-M-d H:m")
            .put(Pattern.compile("^\\\\d4\\\\-\\\\d1,2\\\\-\\\\d1,2 \\\\d1,2$"), "y-M-d H")
            .put(Pattern.compile("^\\\\d4\\\\-\\\\d1,2\\\\-\\\\d1,2$"), "y-M-d")
            .put(Pattern.compile("^\\\\d2:\\\\d1,2:\\\\d1,2\\\\.\\\\d1,3$"), "H:m:s.S")
            .put(Pattern.compile("^\\\\d2:\\\\d1,2:\\\\d1,2$"), "H:m:s")
            .put(Pattern.compile("^\\\\d2:\\\\d1,2$"), "H:m")
            .build();

    //日期规则定义
    public static final String[] DATE_PATTERN = new String[]
            "yyyyMMdd", //编号0
            "yyyyMMddHHmmss", //编号1
            "yyyyMMddHHmm", //编号2
            "yyyy-MM-dd HH:mm:ss", //编号3
            "yyyyMMdd HH:mm", //编号4
            "yyyy-MM-dd", //编号5
            "mm:ss",//编号6
            "yyyy-MM-dd HH:mm"//编号7
    ;

    /**
     * 自动解析日期/时间字符串, 此方法会自动识别日期格式.
     *
     * @param date 任意格式日期时间字符串, 具体参见PATTERN_MAP
     * @return 日期
     */
    public static Date autoParseDate(String date) 
        if (StringUtils.isEmpty(date)) 
            return null;
        
        Date result = null;
        for (Pattern pattern : PATTERN_MAP.keySet()) 
            if (pattern.matcher(date).matches()) 
                String tmp = PATTERN_MAP.get(pattern);
                try 
                    result = parseDate(date, tmp);
                 catch (ParseException e) 
                    throw new RuntimeException("解析[" + tmp + "]格式的日期字符串[" + date + "]失败", e);
                
            
        
        if (result == null) 
            throw new RuntimeException("无法识别日期字符串的格式: " + date);
        
        return result;
    

    /**
     * 将日期yyyy-MM-dd字符串解析为日期对象, 解析失败则返回null
     * 注意! 此方法会吞掉异常!
     *
     * @param date 日期字符串
     * @return 日期实例或null
     */
    public static Date parseDate(String date) 
        try 
            return parseDate(date, 5);
         catch (ParseException e) 
            return null;
        
    

    public static Date parseDate(String date, int index) throws ParseException 
        return parseDate(date, DATE_PATTERN[index]);
    

    /**
     * 将时间yyyy-MM-dd HH:mm:ss字符串解析为日期对象, 解析失败则返回null
     *
     * @param date 日期字符串
     * @return 日期实例或null
     */
    public static Date parseDateTime(String date) 
        Date result;
        try 
            result = parseDate(date, DATE_PATTERN[3]);
         catch (ParseException e) 
            result = null;
        
        return result;
    

    /**
     * 获取今天的日期, 不包括时间. 如yyyy-MM-dd 00:00:00.000
     *
     * @return yyyy-MM-dd 00:00:00.000
     */
    public static Date todayDate() 
        Calendar result = Calendar.getInstance();
        result.set(Calendar.HOUR_OF_DAY, 0);
        result.set(Calendar.MINUTE, 0);
        result.set(Calendar.SECOND, 0);
        result.set(Calendar.MILLISECOND, 0);
        return result.getTime();
    

    /**
     * 根据开始日期和结束日期, 计算日期差.
     * 若日期字符串格式非法, 则返回-1
     *
     * @param from 开始日期
     * @param to   结束日期
     * @return 两个日期之间的天数
     */
    public static int getDays(String from, String to) 
        Date fromDate = parseDate(from);
        Date toDate = parseDate(to);
        int days;
        if (fromDate != null && toDate != null) 
            days = getDays(fromDate, toDate);
         else 
            days = -1;
        
        return days;
    

    /**
     * 根据开始日期和结束日期, 计算日期差
     *
     * @param from 开始日期
     * @param to   结束日期
     * @return 两个日期之间的天数
     */
    public static int getDays(Date from, Date to) 
        int days = 0;
        if (from.before(to)) 
            while (from.before(to)) 
                days++;
                from = addDays(from, 1);
            
         else 
            days = -1;
        
        return days;
    

    /**
     * 获取时间段(闭区间)内的每一天, 日期均以yyyy-MM-dd格式字符串表示
     *
     * @param start 开始日期
     * @param end   结束日期
     * @return 日期段内的每一天, 若日期格式不合法则返回空结果
     */
    public static Set<String> getEveryDay(String start, String end) 
        Set<String> result = new TreeSet<String>();
        Date startDate = parseDate(start);
        Date endDate = parseDate(end);
        if (startDate != null && endDate != null && startDate.getTime() <= endDate.getTime()) 
            Set<Date> allDate = getEveryDay(startDate, endDate);
            for (Date date : allDate) 
                result.add(format(date, DATE_PATTERN[5]));
            
        
        return result;
    

    /**
     * 获取时间段(闭区间)内的每一天
     *
     * @param start 开始日期
     * @param end   结束日期
     * @return 日期段内的每一天
     */
    public static Set<Date> getEveryDay(Date start, Date end) 
        Set<Date> result = new HashSet<Date>();
        while (start.getTime() <= end.getTime()) 
            result.add(start);
            start = addDays(start, 1);
        
        return result;
    

    /**
     * 在指定日期基础上增加day
     */
    public static String addDays(String date, int days) 
        Date tmp = parseDate(date);
        if (tmp == null) 
            return null;
        
        tmp = addDays(tmp, days);
        return DateFormatUtils.format(tmp, DATE_PATTERN[5]);
    

    /**
     * 根据今天的时间 添加 numDay 天的时间
     *
     * @param numDay 要改变的 天数
     * @return
     */
    public static Date addDays(Date date,int numDay) 
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, numDay);//把日期往后增加一天.整数往后推,负数往前移动
        Date tempDay = calendar.getTime();
        return tempDay;
    

    /**
     * 根据今天的时间 添加 numDay 天的时间
     *
     * @param numDay 要改变的 天数
     * @return
     */
    public static Date addDays(int numDay) 
        Date todayDate = DateUtils.todayDate();//取时间
        return addDays(todayDate,numDay);
    

    /**
     * 将日期对象格式化为yyyy-MM-dd格式字符串
     *
     * @param date 日期对象
     * @return yyyy-MM-dd格式字符串
     */
    public static String format(Date date) 
        if (date == null) 
            return null;
        
        return DateFormatUtils.format(date, DATE_PATTERN[5]);
    

    /**
     * 将日期对象格式化为yyyy-MM-dd HH:mm:ss格式字符串
     *
     * @param date 日期对象
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String formatDateTime(Date date) 
        if (date == null) 
            return null;
        
        return DateFormatUtils.format(date, DATE_PATTERN[3]);
    

    /**
     * 将日期格式化为指定格式字符串
     *
     * @param date    日期对象
     * @param pattern 字符串格式
     * @return 日期字符串
     */
    public static String format(Date date, String pattern) 
        if (date == null) 
            return null;
        
        return DateFormatUtils.format(date, pattern);
    


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

最好用的五个安卓地图软件

idea被评为最好用的java开发工具,为什么实际开发中用eclipse的更多?

微PE工具箱 v2.1 正式版,最好用的PE工具箱

推荐15个最好用的 JavaScript 代码压缩工具

有啥类 XShell 或者 Putty 的工具?最最最好用的远程工具没有之一

工具:360安全浏览器最好用的稳定版本大全