时间相关的工具类

1.时间的格式校验,时间的转换,时间的计算
package com.tongsheng.common.utils;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.sql.Time;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * <p>日期处理
 *
 * @author HuYong
 * @since 2019-06-17
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

    /**
     * 时间格式(yyyy-MM-dd)
     */
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /**
     * 时间格式(yyyy-MM)
     */
    public final static String MONTH_DATE_PATTERN = "yyyy-MM";
    /**
     * 时间格式(yyyy-MM-dd HH:mm:ss)
     */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    /**
     * 时间格式(yyyyMMdd)
     */
    public final static String DATE_SHORT_PATTERN = "yyyyMMdd";

    /**
     * 时间格式(yyyyMM)
     */
    public final static String DATE_YYYYMM_PATTERN = "yyyyMM";

    /**
     * 时间格式(yyyy)
     */
    public final static String DATE_YYYY_PATTERN = "yyyy";
    /**
     * 时间格式(yyyyMMddHHmmss)
     */
    public final static String DATE_LONG_PATTERN = "yyyyMMddHHmmss";
    /**
     * 时间格式(yyyyMMddHHmmssSSS)
     */
    public final static String DATE_BIG_LONG_PATTERN = "yyyyMMddHHmmssSSS";


    /**
     * 时间格式(yyyyMMddHHmmssSSS)
     */
    public final static String DATE_SHORT_PATTERNHMS = "HH:mm:ss";


    /**
     * 日期格式化
     *
     * @param String pattern
     * @return Date
     */
    public static Date getDateByPattern(String pattern, String str) {
        try {
            Date date = new SimpleDateFormat(pattern).parse(str);
            return date;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 日期格式化
     *
     * @param String pattern
     * @return Date
     */
    public static String getDateByPattern(Date time, String pattern) {
        try {
            return new SimpleDateFormat(pattern).format(time);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 日期格式化 日期格式为:yyyy-MM-dd
     *
     * @param date 日期
     * @return 返回yyyy-MM-dd格式日期
     */
    public static String formatDate(Date date) {
        return dateToString(date, DATE_PATTERN);
    }

    /**
     * 日期格式化 日期格式为:yyyy-MM
     *
     * @param date 日期
     * @return 返回yyyy-MM格式日期
     */
    public static String monthFormatDate(Date date) {
        return dateToString(date, MONTH_DATE_PATTERN);
    }

    public static String formatDateHMS(Date date) {
        return dateToString(date, DATE_SHORT_PATTERNHMS);
    }

    public static String formatDateYMD(Date date) {
        return dateToString(date, DATE_SHORT_PATTERN);
    }

    /**
     * 获取年月
     *
     * @param date
     * @return
     */
    public static String formatDateYear(Date date) {
        return dateToString(date, DATE_YYYY_PATTERN);
    }

    /**
     * 获取年月
     *
     * @param date
     * @return
     */
    public static String formatDateHM(Date date) {
        return dateToString(date, DATE_YYYYMM_PATTERN);
    }

    /**
     * 日期格式化 日期格式为:yyyy-MM-dd HH:mm:ss
     *
     * @param date 日期
     * @return 返回yyyy-MM-dd HH:mm:ss格式日期
     */
    public static String formatDateTime(Date date) {
        return dateToString(date, DATE_TIME_PATTERN);
    }

    /**
     * 日期格式化 日期格式为:yyyy-MM-dd HH:mm:ss
     *
     * @param date 日期
     * @return 返回yyyy-MM-dd HH:mm:ss格式日期
     */
    public static String formatDateTimeUp(Date date) {
        String d = null;
        try {
            d = dateToString(date, DATE_TIME_PATTERN);
        } catch (Exception ignored) {
        }
        return d;
    }

    /**
     * 字符串转换成日期 日期格式为:yyyy-MM-dd
     *
     * @param date 日期
     * @return 返回yyyy-MM-dd格式日期
     */
    public static Date formatDate(String date) {
        return stringToDate(date, DATE_PATTERN);
    }

    /**
     * 字符串转换成日期 日期格式为:yyyy-MM-dd HH:mm:ss
     *
     * @param date 日期
     * @return 返回yyyy-MM-dd HH:mm:ss格式日期
     */
    public static Date formatDateTime(String date) {
        return stringToDate(date, DATE_TIME_PATTERN);
    }

    /**
     * 日期格式化 日期格式为:yyyy-MM-dd
     *
     * @param date    日期
     * @param pattern 格式,如:DateUtils.DATE_TIME_PATTERN
     * @return 返回yyyy-MM-dd格式日期
     */
    public static String dateToString(Date date, String pattern) {
        if (date != null) {
            SimpleDateFormat df = new SimpleDateFormat(pattern);
            return df.format(date);
        }
        return null;
    }

    /**
     * 日期格式化 日期格式为:yyyy-MM-dd
     *
     * @param date    日期
     * @param pattern 格式,如:DateUtils.DATE_TIME_PATTERN
     * @return 返回yyyy-MM-dd格式日期
     */
    public static String stringToString(String date, String pattern) {
        if (StringUtils.isBlank(date)) {
            return null;
        }
        return dateToString(stringToDate(date, pattern), pattern);
    }

    /**
     * 字符串转换成日期
     *
     * @param strDate 日期字符串
     * @param pattern 日期的格式,如:DateUtils.DATE_TIME_PATTERN
     */
    public static Date stringToDate(String date, String pattern) {
        if (StringUtils.isBlank(date)) {
            return null;
        }
        DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
        return fmt.parseLocalDateTime(date).toDate();
    }

    /**
     * 日期转换成日期
     *
     * @param strDate 日期字符串
     * @param pattern 日期的格式,如:DateUtils.DATE_TIME_PATTERN
     */
    public static Date dateToDate(Date date, String pattern) {
        if (date != null) {
            return stringToDate(dateToString(date, pattern), pattern);
        }
        return null;
    }

    /**
     * 将日期的时分秒变为毫秒值
     *
     * @param Date
     * @return long
     */
    public static Time dateToTime(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);//小时
        int minute = calendar.get(Calendar.MINUTE);//分
        int second = calendar.get(Calendar.SECOND);//秒
        Time time = Time.valueOf(hour + ":" + minute + ":" + second);
        return time;
    }

    /**
     * 身份证计算出生年月yyyy-MM-dd
     *
     * @param idcard
     * @return Date
     */
    public static Date getBirthday(String idcard) {
        String birthday = "";
        if (idcard.length() == 15) {
            birthday = "19" + idcard.substring(6, 8) + "-" + idcard.substring(8, 10) + "-" + idcard.substring(10, 12);
        } else if (idcard.length() == 18) {
            birthday = idcard.substring(6, 10) + "-" + idcard.substring(10, 12) + "-" + idcard.substring(12, 14);
        }
        Date birthdayDate = stringToDate(birthday, DATE_PATTERN);
        return birthdayDate;
    }

    /**
     * 根据年月日计算年龄
     *
     * @param Date
     */
    public static int getAgeByBirth(Date date) {
        int age = 0;
        Calendar cal = Calendar.getInstance();
        if (cal.before(date)) { //出生日期晚于当前时间,无法计算
        } else {
            int yearNow = cal.get(Calendar.YEAR);  //当前年份
            int monthNow = cal.get(Calendar.MONTH);  //当前月份
            int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); //当前日期
            cal.setTime(date);
            int yearBirth = cal.get(Calendar.YEAR);
            int monthBirth = cal.get(Calendar.MONTH);
            int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
            age = yearNow - yearBirth;   //计算整岁数
            if (monthNow <= monthBirth) {
                if (monthNow == monthBirth) {
                    if (dayOfMonthNow < dayOfMonthBirth) {
                        age--;//当前日期在生日之前,年龄减一
                    }
                } else {
                    age--;//当前月份在生日之前,年龄减一
                }
            }
        }
        return age;
    }

    /**
     * 获取当天的开始时间
     *
     * @return Date
     */
    public static Date getDayBegin(Date date) {
        Calendar calendarFrom = Calendar.getInstance();
        calendarFrom.setTime(date); // 获得实体对象里面一个Date类型的属性,set进Calender对象中。
        calendarFrom.set(Calendar.HOUR_OF_DAY, 0);// 设置时为0点
        calendarFrom.set(Calendar.MINUTE, 0);// 设置分钟为0分
        calendarFrom.set(Calendar.SECOND, 0);// 设置秒为0秒
        calendarFrom.set(Calendar.MILLISECOND, 000);// 设置毫秒为000
        return calendarFrom.getTime();
    }

    /**
     * 获取当前时间
     *
     * @return
     */
    public static Date getCurrTime() {
        return new Date();
    }

    /**
     * 计算两个日期之间相差的天数
     *
     * @param sdate 开始时间
     * @param edate 结束时间
     * @return 相差天数
     */
    public static int daysBetween(Date sdate, Date edate) {
        sdate = dateToDate(sdate, DATE_PATTERN);
        edate = dateToDate(edate, DATE_PATTERN);
        Calendar cal = Calendar.getInstance();
        cal.setTime(sdate);
        long time1 = cal.getTimeInMillis();
        cal.setTime(edate);
        long time2 = cal.getTimeInMillis();
        if (time2 > time1) {
            long between_days = (time2 - time1) / (1000 * 3600 * 24);
            return Integer.parseInt(String.valueOf(between_days));
        } else {
            return 0;
        }

    }

    /**
     * 计算两个日期之间相差的天数
     *
     * @param sdate 开始时间
     * @param edate 结束时间
     * @return 相差天数
     */
    public static int daysBetween(String sdate, String edate) {
        Date startDate = DateUtils.formatDate(sdate);
        Date endDate = DateUtils.formatDate(edate);
        startDate = dateToDate(startDate, DATE_PATTERN);
        endDate = dateToDate(endDate, DATE_PATTERN);
        Calendar cal = Calendar.getInstance();
        cal.setTime(startDate);
        long time1 = cal.getTimeInMillis();
        cal.setTime(endDate);
        long time2 = cal.getTimeInMillis();
        if (time2 > time1) {
            long between_days = (time2 - time1) / (1000 * 3600 * 24);
            return Integer.parseInt(String.valueOf(between_days));
        } else {
            return 0;
        }
    }

    /**
     * 计算两个日期之间相差的分钟数
     *
     * @param sdate 开始时间
     * @param edate 结束时间
     * @return 相差天数
     */
    public static int minuteBetween(String sdate, String edate) {
        Date startDate = DateUtils.formatDateTime(sdate);
        Date endDate = DateUtils.formatDateTime(edate);
        startDate = dateToDate(startDate, DATE_TIME_PATTERN);
        endDate = dateToDate(endDate, DATE_TIME_PATTERN);
        Calendar cal = Calendar.getInstance();
        cal.setTime(startDate);
        long time1 = cal.getTimeInMillis();
        cal.setTime(endDate);
        long time2 = cal.getTimeInMillis();
        if (time2 > time1) {
            long between_days = (time2 - time1) / (1000 * 60);
            return Integer.parseInt(String.valueOf(between_days));
        } else {
            return 0;
        }
    }

    /**
     * 获取某天前的日期
     *
     * @param int 4天前-4,4天后+4
     * @return String
     */
    public static String getDaysAgo(int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, day);
        return formatDate(calendar.getTime());
    }

    /**
     * 获取某月的第一天
     *
     * @param Date
     * @return Date
     */
    public static Date getMonthsOneDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return calendar.getTime();
    }

    /**
     * 获取某月的最后一天
     *
     * @param Date
     * @return Date
     */
    public static Date getMonthsEndDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        return calendar.getTime();
    }

    /**
     * 获取某月的所有天数
     *
     * @param Date
     * @return Date
     */
    public static List<java.sql.Date> getAllDaysByMonth(Date date) {
        Date beginDate = getMonthsOneDay(date);
        Date endDate = getMonthsEndDay(date);
        List<java.sql.Date> dateList = new ArrayList<java.sql.Date>();
        dateList.add(new java.sql.Date(beginDate.getTime()));// 把开始时间加入集合
        if (beginDate.getTime() != endDate.getTime()) {
            Calendar cal = Calendar.getInstance();
            // 使用给定的 Date 设置此 Calendar 的时间
            cal.setTime(beginDate);
            boolean bContinue = true;
            while (bContinue) {
                // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
                cal.add(Calendar.DAY_OF_MONTH, 1);
                // 测试此日期是否在指定日期之后
                if (endDate.after(cal.getTime())) {
                    dateList.add(new java.sql.Date(cal.getTime().getTime()));
                } else {
                    break;
                }
            }
            dateList.add(new java.sql.Date(endDate.getTime()));//把结束时间加入集合
        }
        return dateList;
    }

    /**
     * 获取某月的所有天数
     *
     * @param Date
     * @return Date
     */
    public static List<Date> getAllDaysFromStartToEnd(Date beginDate, Date endDate) {
        List<Date> dateList = new ArrayList<Date>();
        dateList.add(beginDate);// 把开始时间加入集合
        if (beginDate.getTime() != endDate.getTime()) {
            Calendar cal = Calendar.getInstance();
            // 使用给定的 Date 设置此 Calendar 的时间
            cal.setTime(beginDate);
            boolean bContinue = true;
            while (bContinue) {
                // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
                cal.add(Calendar.DAY_OF_MONTH, 1);
                // 测试此日期是否在指定日期之后
                if (endDate.after(cal.getTime())) {
                    dateList.add(cal.getTime());
                } else {
                    break;
                }
            }
            dateList.add(endDate);//把结束时间加入集合
        }
        return dateList;
    }

    /**
     * 转换日期格式
     *
     * @param String yyyyMMdd
     * @return String yyyy-MM-dd
     */
    public static String formatDateString(String date) {
        if (StringUtils.isNotBlank(date)) {
            int cc = date.length();
            if (cc > 2) {
                return date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6, 8);
            } else {
                return "长期";
            }
        } else {
            return "";
        }
    }

    /**
     * 获取某月多少天
     *
     * @param String yyyyMMdd
     * @return String yyyy-MM-dd
     */
    public static int getDaysByYearMonth(String year, String month) {
        Calendar a = Calendar.getInstance();
        a.setTime(formatDate(year + "-" + month + "-01"));
        a.set(Calendar.MONTH, Integer.parseInt(month) - 1);
        a.set(Calendar.DATE, 1);
        a.roll(Calendar.DATE, -1);
        int maxDate = a.get(Calendar.DATE);
        return maxDate;
    }

    /**
     * 大象云日期格式转换
     *
     * @param String
     */
    public static Date getDaysByYearMonth(String str) {
        try {
            SimpleDateFormat sf1 = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss z", Locale.ENGLISH);
            Date date = sf1.parse(str);
            return date;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 给定两个日期,获取日期之间的时间集合
     *
     * @param startTime
     * @param endTime   结束时 开始时间间
     */
    public static List<String> getDateList(String startTime, String endTime) {
        List<String> days = new ArrayList<String>();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date start = dateFormat.parse(startTime);
            Date end = dateFormat.parse(endTime);
            Calendar tempStart = Calendar.getInstance();
            tempStart.setTime(start);
            Calendar tempEnd = Calendar.getInstance();
            tempEnd.setTime(end);
            tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
            while (tempStart.before(tempEnd)) {
                days.add(dateFormat.format(tempStart.getTime()));
                tempStart.add(Calendar.DAY_OF_YEAR, 1);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return days;
    }

    /**
     * 获取两个日期间年月集合
     *
     * @param minDate 最小时间  2015-01
     * @param maxDate 最大时间 2015-10
     * @return 日期集合 格式为 年-月
     * @throws Exception
     */
    public static List<String> getMonthBetween(String minDate, String maxDate) {
        ArrayList<String> result = new ArrayList<String>();
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");//格式化为年月

            Calendar min = Calendar.getInstance();
            Calendar max = Calendar.getInstance();

            min.setTime(sdf.parse(minDate));
            min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);

            max.setTime(sdf.parse(maxDate));
            max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);

            while (min.before(max)) {
                result.add(sdf.format(min.getTime()));
                min.add(Calendar.MONTH, 1);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 指定日期加上任意天数,获取最终天数
     *
     * @param date 指定日期
     * @param day  天数
     * @return
     */
    public static Date getDate(Date date, int day) {
        Date newDate = addDate(date, day); // 指定日期加上天
        return newDate;
    }

    public static Date addDate(Date date, long day) {
        long time = date.getTime(); // 得到指定日期的毫秒数
        day = day * 24 * 60 * 60 * 1000; // 要加上的天数转换成毫秒数
        time += day; // 相加得到新的毫秒数
        return new Date(time); // 将毫秒数转换成日期
    }

    /**
     * 判断当前时间 是否在两个时间的范围内
     */
    public static Boolean TimeCheckExample(Integer startDate, Integer endData) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getDefault());
        int currentHour = calendar.get(Calendar.HOUR_OF_DAY);  // 获取当前小时数
        if (currentHour >= startDate && currentHour < endData) {
            return true;
        } else {
            return false;
        }
    }


    /**
     * 随机时间数
     *
     * @param beginDate
     * @param endDate
     * @return
     */
    public static Date randomDate(Date beginDate, Date endDate) {
        if (beginDate.getTime() >= endDate.getTime()) {
            return new Date();
        }
        long date = random(beginDate.getTime(), endDate.getTime());
        return new Date(date);
    }

    public static long random(long begin, long end) {
        long rtn = begin + (long) (Math.random() * (end - begin));
        if (rtn == begin || rtn == end) {
            return random(begin, end);
        }
        return rtn;
    }


    /**
     * 判断时间是否在时间段内
     *
     * @param nowTime
     * @param beginTime
     * @param endTime
     * @return
     */
    public static boolean belongCalendar(String nowTime, String beginTime,
                                         String endTime) {
        Calendar date = Calendar.getInstance();
        date.setTime(formatDate(nowTime));

        Calendar begin = Calendar.getInstance();
        begin.setTime(formatDate(beginTime));

        Calendar end = Calendar.getInstance();
        end.setTime(formatDate(endTime));

        if (date.after(begin) && date.before(end)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断一个日期是不是今天
     *
     * @param date
     * @return
     */
    public static boolean isNow(String date) {
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        Date now = new Date();

        if (sf.format(formatDate(date)).equals(sf.format(now))) {
            return true;
        } else {
            return false;
        }
    }


    /**
     * 判断一个日期与当前时间的对比
     *
     * @param date
     * @return
     */
    public static boolean isEffective(String date) {
        if (StringUtils.isBlank(date)) {
            return false;
        }
        date = date.trim();
        if (date.contains("长期")) {
            return true;
        }
        Date now = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");

//        date = date.replace(".","");

        long longDate = Long.valueOf(date.replace(".", "").replace("-", ""));
        long longNow = Long.valueOf(sf.format(now));

        if (longDate >= longNow) {
            return false;
        }
        return true;
    }

    /**
     * 获取日期
     *
     * @return Date
     */
    public static Date getDate(String dateStr) {
        Date date = null;
        try {
            date = DateUtils.formatDateTime(dateStr);
        } catch (Exception e) {
            try {
                date = DateUtils.formatDate(dateStr);
            } catch (Exception ignored) {
            }
        }
        return date;
    }

    /**
     * 获取带点的日期(1999.01.01)
     *
     * @return Date
     */
    public static Date getPointDate(String dateStr) {
        Date date = null;
        if (StringUtils.isBlank(dateStr)) {
            return date;
        }
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd");
            date = simpleDateFormat.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
            return date;
        }
        return date;
    }

    /**
     * 判断一个日期与当前时间的对比
     *
     * @param date
     * @return
     */
    public static String forDate(String date, String pattern) {
        String day = null;
        Date d = getDate(date);
        if (d != null) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
            day = simpleDateFormat.format(d);
        }
        return day;
    }

    /**
     * 比较两个日期
     *
     * @param date1
     * @param date2
     * @return -1 date1 < date2 | 0 date1 = date2  |  1 date1 ></> date2
     */
    public static int compareDate(Date date1, Date date2) {
        try {
            return Long.compare(date1.getTime(), date2.getTime() - 600000);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }

    /**
     * 比较两个日期
     *
     * @param date1
     * @param date2
     * @return -1 date1 < date2 | 0 date1 = date2  |  1 date1 ></> date2
     */
    public static int compareDateCommon(Date date1, Date date2) {
        try {
            return Long.compare(date1.getTime(), date2.getTime());
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }

    /**
     * 获取某个月份天数
     *
     * @param match   yyyyMM
     * @param dateStr
     * @return
     */
    public static int getDaysOfMonth(String match, String dateStr) {
        Date date = getDateByPattern(match, dateStr);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }

    /**
     * 毫秒转为当前日期
     *
     * @param time 毫秒
     */
    public static String millisecondToDate(Long time) {
        Date d = new Date(time);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(d);
    }

    /**
     * 当前时间转时间戳
     *
     * @param
     */
    public static String getDateTimeStr() {
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_LONG_PATTERN);
        return sdf.format(d);
    }

    /**
     * 时间戳转当前时间
     *
     * @param
     */
    public static String timeStrToString(long time) {
        String rs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time);
        return rs;
    }

    /**
     * 通过时间字符串获取时间
     *
     * @param dateStr
     * @return
     */
    public static Date getDateByDateStr(String dateStr) {
        Date date = null;
        try {
            String reg = "";
            if (dateStr.indexOf(".") > 0) {
                reg = "yyyy.MM.dd";
            } else if (dateStr.indexOf("-") > 0) {
                reg = "yyyy-MM-dd";
            } else if (dateStr.indexOf(":") > 0) {
                reg = "yyyy:MM:dd";
            }
            SimpleDateFormat sdf = new SimpleDateFormat(reg);
            date = sdf.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 通过时间字符串获取时间
     *
     * @param dateStr
     * @return
     */
    public static Date getDateByConditions(String dateStr) {
        if (dateStr == null) {
            return null;
        }
        Date date = null;
        try {
            String reg = "";
            if (dateStr.indexOf(".") > 0) {
                reg = "yyyy.MM.dd";
            } else if (dateStr.indexOf("-") > 0) {
                reg = "yyyy-MM-dd";
            } else if (dateStr.indexOf(":") > 0) {
                reg = "yyyy:MM:dd";
            } else {
                reg = "yyyyMMdd";
            }
            SimpleDateFormat sdf = new SimpleDateFormat(reg);
            date = sdf.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * @param date 是为则默认今天日期、可自行设置“2013-06-03”格式的日期
     * @return 返回1是星期日、2是星期一、3是星期二、4是星期三、5是星期四、6是星期五、7是星期六
     */
    public static int getDayOfWeek(String date) {
        Calendar cal = Calendar.getInstance();
        if (date.equals("")) {
            cal.setTime(new Date(System.currentTimeMillis()));
        } else {
            cal.setTime(new Date(formatDate(date).getTime()));
        }
        return cal.get(Calendar.DAY_OF_WEEK);
    }

    //返回某天是星期几
    public static String getDayOfWeekChinese(String date) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "星期日");
        map.put(2, "星期一");
        map.put(3, "星期二");
        map.put(4, "星期三");
        map.put(5, "星期四");
        map.put(6, "星期五");
        map.put(7, "星期六");
        return map.get(getDayOfWeek(date));
    }


    public static boolean isValidDate(String str) {
        boolean convertSuccess = true;
        // 指定日期格式为四位年/两位月份/两位日期,注意yyyy/MM/dd区分大小写;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
            format.setLenient(false);
            format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
            // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
            convertSuccess = false;
        }
        return convertSuccess;
    }

    /**
     * 将 yyyyMMddHHmmss 转成 yyyy-MM-dd HH:mm:ss
     *
     * @param date
     * @return
     */
    public static String stringToString(String date) {
        DateFormat df1 = new SimpleDateFormat("yyyyMMddHHmmss");
        DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date time1 = df1.parse(date);
            return df2.format(time1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * UTC转成北京时间
     *
     * @param UTCStr
     * @return
     */
    public static Date UTCToCST(String UTCStr) {
        try {
            Date date = new Date();
            date.setTime(Long.parseLong(UTCStr));
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR));
            return calendar.getTime();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取某月的第一天和最后一天
     *
     * @return
     */
    public static Map<String, String> getMonthOneAndLastDay(String month) {
        if (StringUtils.isBlank(month)) {
            return null;
        }
        Map<String, String> day = new HashMap<>();
        // 获取当月第一天和最后一天
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String firstday, lastday;
        // 获取前月的第一天
        Calendar cale = null;
        cale = Calendar.getInstance();
        cale.setTime(Objects.requireNonNull(stringToDate(month, "yyyy-MM")));
        cale.add(Calendar.MONTH, 0);
        cale.set(Calendar.DAY_OF_MONTH, 1);
        firstday = format.format(cale.getTime());
        // 获取前月的最后一天
        cale.add(Calendar.MONTH, 1);
        cale.set(Calendar.DAY_OF_MONTH, 0);
        lastday = format.format(cale.getTime());
        day.put("first", firstday);
        day.put("last", lastday);
        return day;
    }

    /**
     * 获取某月的第一天和最后一天
     *
     * @return
     */
    public static Map<String, String> getMonthOneAndLastDay(Date date) {
        Map<String, String> day = new HashMap<>();
        // 获取当月第一天和最后一天
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String firstday, lastday;
        // 获取前月的第一天
        Calendar cale = null;
        cale = Calendar.getInstance();
        cale.setTime(date);
        cale.add(Calendar.MONTH, 0);
        cale.set(Calendar.DAY_OF_MONTH, 1);
        firstday = format.format(cale.getTime());
        // 获取前月的最后一天
        cale.add(Calendar.MONTH, 1);
        cale.set(Calendar.DAY_OF_MONTH, 0);
        lastday = format.format(cale.getTime());
        day.put("first", firstday);
        day.put("last", lastday);
        return day;
    }

    /**
     * 取当前日期(天)的当前周的第一天和最后一天日期
     *
     * @param month
     * @return
     */
    public static Map<String, String> getWeekDay(Date date) {
        Map<String, String> dayMap = new HashMap<>();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - dayOfWeek + 1);
        dayMap.put("first", dateToString(calendar.getTime(), "yyyy-MM-dd"));
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 6);
        dayMap.put("last", dateToString(calendar.getTime(), "yyyy-MM-dd"));
        return dayMap;
    }

    /**
     * 取当前日期(天)的当前周的第一天和最后一天日期
     *
     * @param month
     * @return
     */
    public static Map<String, String> getWeekDay(String day) {
        Map<String, String> dayMap = new HashMap<>();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(stringToDate(day, "yyyy-MM-dd"));
        int dayOfWeek = calendar.get(calendar.DAY_OF_WEEK);
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - dayOfWeek + 1);
        dayMap.put("first", dateToString(calendar.getTime(), "yyyy-MM-dd"));
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 6);
        dayMap.put("last", dateToString(calendar.getTime(), "yyyy-MM-dd"));
        return dayMap;
    }

    /**
     * 获取某月的最后一天
     *
     * @throws
     * @Title:getLastDayOfMonth
     * @Description:
     * @param:@param year
     * @param:@param month
     * @param:@return
     * @return:String
     */
    public static String getLastDayOfMonth(String time) {
        int year = Integer.parseInt(time.substring(0, time.indexOf("-")));
        int month = Integer.parseInt(time.substring(time.indexOf("-") + 1));
        Calendar cal = Calendar.getInstance();
        //设置年份
        cal.set(Calendar.YEAR, year);
        //设置月份
        cal.set(Calendar.MONTH, month - 1);
        //获取某月最大天数
        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        //设置日历中月份的最大天数
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(cal.getTime());
    }

    /**
     * 获取一个区间内的所有天数,返回 字符串数组
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return Date
     */
    public static List<String> dateList(String startTime, String endTime) {
        Date beginDate = formatDate(startTime);
        Date endDate = formatDate(endTime);
        List<String> dateList = new ArrayList<String>();
        dateList.add(startTime);// 把开始时间加入集合
        if (beginDate.getTime() != endDate.getTime()) {
            Calendar cal = Calendar.getInstance();
            // 使用给定的 Date 设置此 Calendar 的时间
            cal.setTime(beginDate);
            while (true) {
                // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
                cal.add(Calendar.DAY_OF_MONTH, 1);
                // 测试此日期是否在指定日期之后
                if (endDate.after(cal.getTime())) {
                    dateList.add(formatDate(cal.getTime()));
                } else {
                    break;
                }
            }
            dateList.add(endTime);//把结束时间加入集合
        }
        return dateList;
    }

    /**
     * 获取昨天的日期
     *
     * @return
     */
    public static Date getYesterday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        return cal.getTime();
    }


    /**
     * 通过时间字符串获取时间
     *
     * @param dateStr
     * @return
     */
    public static Date getTimeByConditions(String dateStr) {
        if (dateStr == null) {
            return null;
        }
        Date date = null;
        try {
            String reg = "";
            if (dateStr.indexOf(".") > 0) {
                if (getStrCount(dateStr, ":") == 2) {
                    reg = "yyyy.MM.dd HH:mm:ss";
                } else if (getStrCount(dateStr, ":") == 1) {
                    reg = "yyyy.MM.dd HH:mm";
                } else {
                    reg = "yyyy.MM.dd";
                }
            } else if (dateStr.indexOf("-") > 0) {
                if (getStrCount(dateStr, ":") == 2) {
                    reg = "yyyy-MM-dd HH:mm:ss";
                } else if (getStrCount(dateStr, ":") == 1) {
                    reg = "yyyy-MM-dd HH:mm";
                } else {
                    reg = "yyyy-MM-dd";
                }
            } else {
                if (getStrCount(dateStr, ":") == 2) {
                    reg = "yyyyMMdd HH:mm:ss";
                } else if (getStrCount(dateStr, ":") == 1) {
                    reg = "yyyyMMdd HH:mm";
                } else {
                    reg = "yyyyMMdd";
                }
            }
            SimpleDateFormat sdf = new SimpleDateFormat(reg);
            date = sdf.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 获取字符串出现次数
     *
     * @param str
     * @param searchStr
     * @return
     */
    public static int getStrCount(String str, String searchStr) {
        int index = 0;//define the index
        int count = 0;//define the count
        while ((index = str.indexOf(searchStr, index)) != -1) {
            if (searchStr.equals(str.substring(index, index + searchStr.length()))) {
                System.out.println("index is :" + index);//print index
                index = index + searchStr.length();
                count++;
            }
        }
        return count;
    }

    /**
     * 通过时间字符串获取时间
     *
     * @param dateStr
     * @return
     */
    public static Date getDateByCondition(String dateStr) {
        if (StringUtils.isBlank(dateStr)) {
            return null;
        }
        Date date = null;
        try {
            String reg = "";
            if (dateStr.indexOf(".") > 0) {
                reg = "yyyy.MM.dd";
            } else if (dateStr.indexOf("-") > 0) {
                reg = "yyyy-MM-dd";
            } else if (dateStr.indexOf(":") > 0) {
                reg = "yyyy:MM:dd";
            } else if (dateStr.indexOf("/") > 0) {
                reg = "yyyy/MM/dd";
            }
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(reg);
            date = simpleDateFormat.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 将传进来的时间转为当前日+传进来的时间的时分秒
     *
     * @param date
     * @return
     */
    public static String dateToNowDate(Date date) {
        String dateTime = formatDateTime(date);
        String nowTime = formatDateTime(new Date());
        return nowTime.split(" ")[0] + dateTime.split(" ")[1];
    }

    /**
     * 获取本周第一天的日期  yyyy-MM-dd
     *
     * @return String
     */
    public static String getWeekStartDate() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        Date date = cal.getTime();
        SimpleDateFormat dformat = new SimpleDateFormat("yyyy-MM-dd");
        String format = dformat.format(date);
        return format;
    }

    /**
     * 获取当前时间的日期
     *
     * @return
     */
    public static String getDate() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date1 = new Date();
        String currentTime = dateFormat.format(date1);
        return currentTime;
    }

    public static String getHour() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:00:00");
        Date date1 = new Date();
        String currentTime = dateFormat.format(date1);
        return currentTime;
    }

    public static String getNextHour() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:00:00");
        Calendar calendar = new GregorianCalendar();
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + 1);
        String currentTime = dateFormat.format(calendar.getTime());
        return currentTime;
    }

    /**
     * 获取明天日期
     */
    public static String getTomorrow() {
        SimpleDateFormat smdate = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(new Date());
        calendar.add(calendar.DATE, 1);
        String date = smdate.format(calendar.getTime());
        return date;
    }
 /*   public static void main(String[] args) {
        System.out.println(getWeekDay("2020-08-12"));
    }*/

    /**
     * 查询几个小时前的时间
     *
     * @param date
     * @return
     */
    public static Date dateBeforDate(Date date, int i) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - i);
        return calendar.getTime();
    }


    /**
     * 时间转换成时间戳,参数和返回值都是字符串
     *
     * @param s
     * @return res
     * @throws ParseException
     */
    public static String dateToStamp(String s) throws ParseException {
        String res;
        //设置时间模版
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = simpleDateFormat.parse(s);
        long ts = date.getTime();
        res = String.valueOf(ts);
        return res;
    }

    /**
     * 取两个时间相差的天数不足向下取整
     *
     * @param start 开始时间
     * @param end   结束时间
     * @return 相差天数 为-1表示开始时间大于结束时间 -2开始时间或结束时间为空
     */
    public static int getTwoDaysBetweenDays(String start, String end) {
        if (StringUtils.isBlank(start) || StringUtils.isBlank(end)) {
            return -2;
        }
        Date startDate = formatDateTime(start);
        Date endDate = formatDateTime(end);
        if (null == startDate || null == endDate) {
            return -2;
        }
        if (startDate.getTime() > endDate.getTime()) {
            return -1;
        }
        long startTime = startDate.getTime();
        long endTime = endDate.getTime();
        long betweenDays = (endTime - startTime) / (1000 * 3600 * 24);
        return (int) betweenDays;
    }

    /**
     * 取两个时间相差的天数不足向下取整
     *
     * @param start 开始时间
     * @param end   结束时间
     * @return 相差天数 为-1表示开始时间大于结束时间 -2开始时间或结束时间为空
     */
    public static int getTwoDaysBetweenS(String start, String end) {
        if (StringUtils.isBlank(start) || StringUtils.isBlank(end)) {
            return -2;
        }
        Date startDate = formatDateTime(start);
        Date endDate = formatDateTime(end);
        if (null == startDate || null == endDate) {
            return -2;
        }
        if (startDate.getTime() > endDate.getTime()) {
            return -1;
        }
        long startTime = startDate.getTime();
        long endTime = endDate.getTime();
        long betweenDays = (endTime - startTime) / (1000);
        return (int) betweenDays;
    }

    /**
     * 指定返回当天的前几天
     *
     * @param date
     * @param day
     * @return
     */
    public static Date returnPre(Date date, int day) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, day * -1);
        return calendar.getTime();
    }

    /**
     * 指定返回当天的前几天
     *
     * @param time
     * @param day
     * @return
     */
    public static Date returnPre(String time, int day) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar calendar = new GregorianCalendar();
        try {
            calendar.setTime(simpleDateFormat.parse(time));
            calendar.add(Calendar.DATE, day * -1);
            return calendar.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 获取两个时间相差的小时
     *
     * @param startDate
     * @param endDate
     * @return
     */
    public static double getHourDiff(Date startDate, Date endDate) {
        long diff = endDate.getTime() - startDate.getTime();
        if (diff < 0) {
            return 0;
        }
        return (Math.round(diff * 1.0 / 1000 / 60 / 60 * 100)) * 1.0 / 100;
    }

    public static void main(String[] args) {
        System.out.println(getHourDiff(DateUtils.formatDateTime("2022-09-27 09:36:36"), new Date()));
        System.out.println(getDaysAgo(-90));

        System.out.println(getMonthOneAndLastDay(new Date()));
        System.out.println(DateUtils.formatDate(DateUtils.returnPre(new Date(), 7)));
        System.out.println(DateUtils.formatDateTime("2023-07-25 15:33:45.6876108+08:00".substring(0, 19).replace("T", " ")));
    }

    /**
     * 得到UTC时间,类型为字符串,格式为"yyyy-MM-dd HH:mm"
     * <p>
     * 如果获取失败,返回null
     *
     * @return
     */
    public static String getUTCTimeStr() {
        StringBuffer UTCTimeBuffer = new StringBuffer();
        // 1、取得本地时间:
        Calendar cal = Calendar.getInstance();
        // 2、取得时间偏移量:
        int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET);
        // 3、取得夏令时差:
        int dstOffset = cal.get(java.util.Calendar.DST_OFFSET);
        // 4、从本地时间里扣除这些差量,即可以取得UTC时间:
        cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset));
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1;
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int hour = cal.get(Calendar.HOUR_OF_DAY);
        int minute = cal.get(Calendar.MINUTE);
        int seconds = cal.get(Calendar.SECOND);
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        UTCTimeBuffer.append(year).append("-").append(month).append("-").append(day);
        UTCTimeBuffer.append(" ").append(hour).append(":").append(minute).append(":").append(seconds);
        try {
            format.parse(UTCTimeBuffer.toString());
            return UTCTimeBuffer.toString();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;

    }

    /**
     * 将UTC时间转换为东八区时间
     *
     * @param UTCTime
     * @return
     */

    public static String getLocalTimeFromUTC(String UTCTime) {
        java.util.Date UTCDate = null;
        String localTimeStr = null;
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            UTCDate = format.parse(UTCTime);
            format.setTimeZone(TimeZone.getTimeZone("GMT-8"));
            localTimeStr = format.format(UTCDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return localTimeStr;

    }

    public static String getUtcTime(String datePattern) {
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        StringBuffer UTCTimeBuffer = new StringBuffer();
        // 1、取得本地时间:
        // 获取UTC时间
        // 获取UTC时间
        Date date = new Date();
        // 获取UTC时间的毫秒数
        long time = date.getTime();
        // 转换为UTC时间
        Date utcDate = new Date(time - TimeZone.getDefault().getRawOffset());
        return DateUtil.format(utcDate, datePattern + ".000");
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值