时间管理工具类 DateUtils

package union.com.viewgroup;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern;

/*
 * @Auther   xiaobo
 * @Date     2019/8/13   9:28
 * @Version  1.0
 * @Desc     时间格式处理工具类
 */
public class DateUtils {

    private static Calendar calendar = Calendar.getInstance(new Locale("zh"));
    private static DateFormat sdf;
    // 匹配 yyyy-MM-dd
    private static String regxY1 = "[1-9][0-9][0-9][0-9]-(0[1-9]|1[0-2])-[0-9][0-9]";
    // 匹配 yyyy:MM:dd hh:mm:ss
    private static String regxY3 = "[1-9][0-9][0-9][0-9]:(0[1-9]|1[0-2]):[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]";
    // 匹配 yyyy-MM-dd hh:mm:ss
    private static String regxY4 = "[1-9][0-9][0-9][0-9]-(0[1-9]|1[0-2])-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]";
    // 匹配 yyyy-MM-dd hh:mm
    private static String regxY6 = "[1-9][0-9][0-9][0-9]-(0[1-9]|1[0-2])-[0-9][0-9] [0-9][0-9]:[0-9][0-9]";


    private final static long minute = 60 * 1000;// 1分钟
    private final static long hour = 60 * minute;// 1小时
    private final static long day = 24 * hour;// 1天
    private final static long month = 31 * day;// 月
    private final static long year = 12 * month;// 年

    /**
     * @param day     推迟的天数
     * @param pattern 格式
     * @return 获取当前向后推迟 n 天的日期
     */
    public static String getCurrentDateAfterAddDayFormat(int day, String pattern) {
        sdf = new SimpleDateFormat(pattern);
        return sdf.format(getCurentDateFormatAfterAddDay(day));
    }

    /**
     * @param day     推迟的天数
     * @param pattern 格式
     * @return 获取当前向前推迟 n 天的日期
     */
    public static String getCurrentDateBeforeDayFormat(int day, String pattern) {
        sdf = new SimpleDateFormat(pattern);
        return sdf.format(getCurentDateFormatBeforeDay(day));
    }

    /**
     * @param pattern 返回昨天之前 pattern  的格式日期
     * @return 获取 “今天 00:00 、昨天 00:00 pattern 格式的日期 ”
     */
    public static String getFormTime(String pattern) {
        Calendar inputTime = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.clear(Calendar.MINUTE);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.clear(Calendar.SECOND);
        inputTime.setTimeInMillis(System.currentTimeMillis());
        if (calendar.before(inputTime)) {
            return "今天";
        } else {
            calendar.set(Calendar.DAY_OF_MONTH, -1);
            if (calendar.before(inputTime)) {
                return "昨天";
            }
        }
        return getCurrentDateFormat(pattern);
    }


    /**
     * @param pattern 返回昨天之前 pattern  的格式日期
     * @return 获取 “今天 00:00 、昨天 00:00 pattern 格式的日期 ”
     */
    public static String getFormTimeInputFormat(String inputTimeStr) {
        String pattern = "yyyy-MM-dd";
        try {
            pattern = paseDate(inputTimeStr, returnFormat(inputTimeStr));
            Calendar inputTime = Calendar.getInstance();
            DateFormat format = getSDFFormat(inputTimeStr);
            Date date = getData(format, inputTimeStr);
            calendar.setTime(new Date());
            calendar.clear(Calendar.MINUTE);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.clear(Calendar.SECOND);
            inputTime.setTimeInMillis(date.getTime());
            if (calendar.before(inputTime)) {
                return "今天";
            } else {
                calendar.set(Calendar.DAY_OF_MONTH, -1);
                if (calendar.before(inputTime)) {
                    return "昨天";
                }
            }
            return getCurrentDateFormat(pattern);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return getCurrentDateFormat(pattern);
    }

    /**
     * @param pattern 时间样式
     * @return 获取时间format 样式
     */
    public static String getCurrentDateFormat(String pattern) {
        sdf = new SimpleDateFormat(pattern);
        return sdf.format(getCurentDate());
    }

    /**
     * @param date    要格式的日期
     * @param pattern 输出的格式
     * @return 格式化输入格式
     */
    public static String getFormatInputTime(Date date, String pattern) {
        sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }


    /**
     * @param inputTime 输入时间
     * @param pattern   输入的格式
     * @return 转换输入的时间为期望的输入格式
     */
    public static String paseDate(String inputTime, String pattern) {
        try {
            sdf = getSDFFormat(inputTime);
            Date data = getData(sdf, inputTime);
            return getFormatInputTime(data, pattern);
        } catch (ParseException e) {
            e.printStackTrace();
            throw new IllegalArgumentException("参数非法");
        }
    }

    /**
     * 获取输入格式的 Data
     *
     * @param inputTime
     * @return
     * @throws ParseException
     */
    private static Date getData(DateFormat df, String inputTime) throws ParseException {
        return df.parse(inputTime);
    }


    /**
     * 根据inputTime 获取对应格式的SimpleDateFormat
     *
     * @param inputTime 输入的时间
     */
    private static DateFormat getSDFFormat(String inputTime) {
        if (isMatchInput(regxY1, inputTime)) {
            sdf = new SimpleDateFormat("yyyy-MM-dd");
        } else if (isMatchInput(regxY3, inputTime)) {
            sdf = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss");
        } else if (isMatchInput(regxY4, inputTime)) {
            sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        } else if (isMatchInput(regxY6, inputTime)) {
            sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");
        }
        return sdf;
    }

    /**
     * 返回输入时间的格式
     *
     * @param inputTime 输入时间
     * @return 解析格式
     * @throws IllegalAccessException
     */
    private static String returnFormat(String inputTime) throws IllegalAccessException {
        if (isMatchInput(regxY1, inputTime)) {
            return "yyyy-MM-dd";
        } else if (isMatchInput(regxY3, inputTime)) {
            return "yyyy:MM:dd hh:mm:ss";
        } else if (isMatchInput(regxY4, inputTime)) {
            return "yyyy-MM-dd hh:mm:ss";
        } else if (isMatchInput(regxY6, inputTime)) {
            return "yyyy-MM-dd hh:mm";
        } else {
            throw new IllegalAccessException("格式不识别");
        }
    }


    //-------------------------------分割线-------------------------

    /**
     * 时间格式是否匹配
     *
     * @param regex     匹配表达式
     * @param inputDate 输入格式
     * @return 匹配结果
     */
    private static boolean isMatchInput(String regex, String inputDate) {
        boolean isMatch = Pattern.matches(regex, inputDate);
        return isMatch;
    }

    /**
     * @return 获取当前时间Date
     */
    private static Date getCurentDate() {
        calendar.setTime(new Date());
        return calendar.getTime();
    }


    /**
     * 当前日期向后推迟 day 天
     *
     * @param day 推迟的天数
     * @return
     */
    private static Date getCurentDateFormatAfterAddDay(int day) {
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, day);
        return calendar.getTime();
    }

    /**
     * 当前日期向前推迟 day 天
     *
     * @param day 推迟的天数
     * @return
     */
    private static Date getCurentDateFormatBeforeDay(int day) {
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, -day);
        return calendar.getTime();
    }

    /**
     * 具体分钟之前
     * @param date  日期
     * @return      具体格式化
     */
    public static String getTimeFormatText(Date date) {
        if (date == null) {
            return null;
        }
        long diff = new Date().getTime() - date.getTime();
        long r = 0;
        if (diff > year) {
            r = (diff / year);
            return r + "年前";
        }
        if (diff > month) {
            r = (diff / month);
            return r + "个月前";
        }
        if (diff > day) {
            r = (diff / day);
            return r + "天前";
        }
        if (diff > hour) {
            r = (diff / hour);
            return r + "个小时前";
        }
        if (diff > minute) {
            r = (diff / minute);
            return r + "分钟前";
        }
        return "刚刚";
    }
    /**
     * 具体分钟之前
     * @param date  日期
     * @return      具体格式化
     */
    public static String getTimeFormatText(String inputTime) {
        try{
            DateFormat sdf = getSDFFormat(inputTime);
            Date date = getData(sdf, inputTime);
            if (date == null) {
                return null;
            }
            long diff = new Date().getTime() - date.getTime();
            long r = 0;
            if (diff > year) {
                r = (diff / year);
                return r + "年前";
            }
            if (diff > month) {
                r = (diff / month);
                return r + "个月前";
            }
            if (diff > day) {
                r = (diff / day);
                return r + "天前";
            }
            if (diff > hour) {
                r = (diff / hour);
                return r + "个小时前";
            }
            if (diff > minute) {
                r = (diff / minute);
                return r + "分钟前";
            }
            return "刚刚";
        }catch (Exception e){
            return "inputTime";
        }
    }

    /**
     * 处理分钟显示
     *
     * @param inputTime 输入时间
     * @param during    分钟间隔
     * @return 返回处理结果
     */
    public static String getMin(String inputTime, int during) {
        try {
            Calendar currentTimeCalenDar = Calendar.getInstance();
            currentTimeCalenDar.setTime(new Date());
            DateFormat sdf = getSDFFormat(inputTime);
            calendar.setTime(getData(sdf, inputTime));
            calendar.get(Calendar.MINUTE);
            if (currentTimeCalenDar.get(Calendar.YEAR) - calendar.get(Calendar.YEAR) == 0 &&
                    currentTimeCalenDar.get(Calendar.MONTH) - calendar.get(Calendar.MONTH) == 0
                    && currentTimeCalenDar.get(Calendar.DATE) - calendar.get(Calendar.DATE) == 0
            ) {
                //2019-08-12 17:30:20
                if (currentTimeCalenDar.get(Calendar.MINUTE) - calendar.get(Calendar.MINUTE) > during) {
                    if (currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) < 0) {
                        return currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) + "分钟前";
                    } else {
                        if (currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) > 1) {
                            return getFormTimeInputFormat(inputTime);
                        } else {
                            return during + "分钟前";
                        }
                    }
                } else {
                    if (currentTimeCalenDar.get(Calendar.MINUTE) - calendar.get(Calendar.MINUTE) < 0) {
                        if (((currentTimeCalenDar.get(Calendar.MINUTE) - calendar.get(Calendar.MINUTE)) + 60) > during) {
                            if (currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) > 1) {
                                return getFormTimeInputFormat(inputTime);
                            } else {
                                return during + "分钟前";
                            }
                        } else {
                            if (currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) > 1) {
                                return getFormTimeInputFormat(inputTime);
                            } else {
                                return ((currentTimeCalenDar.get(Calendar.MINUTE) - calendar.get(Calendar.MINUTE)) + 60) + "分钟前";
                            }
                        }

                    } else {
                        if (currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) > 1) {
                            return getFormTimeInputFormat(inputTime);
                        } else {
                            if(currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) == 1){
                                return getFormTimeInputFormat(inputTime);
                            }else {
                                return ((currentTimeCalenDar.get(Calendar.MINUTE) - calendar.get(Calendar.MINUTE))) + "分钟前";
                            }
                        }
                    }
                }
            } else {
                return getFormTimeInputFormat(inputTime);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return inputTime;
    }


    public static void main(String[] args) {
        //获取当前向后推迟 n 天的日期
        String YYYYMMDD = ("yyyy-MM-dd HH:mm:ss");
        System.out.println(getCurrentDateAfterAddDayFormat(1, YYYYMMDD) + "");
        System.out.println("----------------------");
        System.out.println(getCurrentDateBeforeDayFormat(3, YYYYMMDD) + "");
        System.out.println("----------------------");
        System.out.println(getFormTime(YYYYMMDD) + "");
        System.out.println("----------------------");
        System.out.println("匹配yyyy-MM-dd: " + isMatchInput(regxY1, "2018-05-06"));
        System.out.println("匹配yyyy:MM:dd: " + isMatchInput(regxY3, "2019:08:12 17:25:30"));
        System.out.println("匹配yyyy-MM-dd " + isMatchInput(regxY4, "2019-08-12 17:25:30"));
        System.out.println("匹配yyyy-MM-dd " + isMatchInput(regxY6, "2019-08-12 17:25"));
        System.out.println("----------------------");
        System.out.println(paseDate("2018-05-06 17:25:20", "yyyy-MM-dd"));
        System.out.println("----------------------");
        String during = getMin("2019-08-12 20:00:20", 60);
        System.out.println(during);
        System.out.println("----------------------");
        String forData = getTimeFormatText("2019-08-12 20:00:20");
        System.out.println(forData);
    }

}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值