Java日期工具類(基於JDK1.7版本)


我們在開發中無法避免需要處理時間日期問題,這就需要積累些處理的函數了:下面是部分處理時間的函數,分享給大家:

需要注意: JDK 版本為: 1.7

public class DateUtil {
    private static final String yyyyMMddHHmmss = "yyyy-MM-dd HH:mm:ss";
    private static final String yyyyMMdd = "yyyy-MM-dd";
    private static final String HHmmdd = "HH:mm:ss";
    private static final String DAY = "day", MONTH = "month", YEAR = "year", WEEK = "week";
    private static final String HOUR = "hour", MINNUTE = "minute", SECOND = "second";
    /**
     * 日期正則表達式
     */
    public static final String YEAR_REGEX = "^\\d{4}$";
    public static final String MONTH_REGEX = "^\\d{4}(\\-|\\/|\\.)\\d{1,2}$";
    public static final String DATE_REGEX = "^\\d{4}(\\-|\\/|\\.)\\d{1,2}\\1\\d{1,2}$";

    /**
     * 將日期轉換為指定格式的字符串
     *
     * @param date   java.util.Date 日期(如果為NULL,則默認為當前時間)
     * @param format 需要轉換后得到的格式(例如:"yyyy-MM-dd HH:mm:ss"){@link DateUtil#yyyyMMddHHmmss}
     * @return
     */
    public static String getDateTimeStr(Date date, String format) {
        if (date == null) {
            date = new Date();
        }
        if (format == null || format.isEmpty()) {
            format = yyyyMMddHHmmss;
        }
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 日期字符串 → 日期(java.util.Date)
     *
     * @param dateTimeStr 日期字符串(例如:"yyyy-MM-dd HH:mm:ss")
     * @param format      轉成日期的格式(注意:必須和日期字符串中的元素對應上){@link DateUtil#yyyyMMddHHmmss}
     * @return
     */
    public static Date getDateTime(String dateTimeStr, String format) {
        if (format == null || format.isEmpty()) {
            format = yyyyMMdd;
        }
        Date date = null;
        try {
            date = new SimpleDateFormat(format).parse(dateTimeStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 獲取指定日期所在月份的天數
     *
     * @param dateStr 格式最低要求為:"yyyy-MM-dd"
     * @return
     */
    public static String getDaysOfMonth(String dateStr) {
        return null;
    }

    /**
     * 時間戳轉化為北京時間日期格式
     *
     * @param pattern   如:yyyy-MM-dd HH:mm:ss 獲取時間格式為:  年-月-日 時:分:秒<br>
     *                  pattern模式匹配語法:
     *                  G 年代標志符<br>
     *                  y 年<br>
     *                  M 月<br>
     *                  d 日<br>
     *                  h 時 在上午或下午 (1~12)<br>
     *                  H 時 在一天中 (0~23)<br>
     *                  m 分<br>
     *                  s 秒<br>
     *                  S 毫秒<br>
     *                  E 星期<br>
     *                  D 一年中的第幾天<br>
     *                  F 一月中第幾個星期幾<br>
     *                  w 一年中第幾個星期<br>
     *                  W 一月中第幾個星期<br>
     *                  a 上午 / 下午 標記符<br>
     *                  k 時 在一天中 (1~24)<br>
     *                  K 時 在上午或下午 (0~11)<br>
     *                  z 時區<br>
     * @param timestamp 時間戳
     * @return
     */
    public static String timestamp2DateTime(String pattern, long timestamp) {
        //使用簡體中文所在的時區
        SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.SIMPLIFIED_CHINESE);
        return format.format(timestamp);
    }

    /**
     * 獲取當前時間的時間戳,精確到秒。
     *
     * @return 時間戳
     */
    public static long getTimestamp() {
        return System.currentTimeMillis() / 1000;
    }

    /**
     * 時間戳 → 指定格式的字符串
     *
     * @param format    格式
     * @param timestamp 時間戳
     * @return
     */
    public static String getDateTime(String format, long timestamp) {
        return new SimpleDateFormat(format).format(timestamp);
    }

    /**
     * 判斷日期是否為月底最后一天
     *
     * @param date 日期(java.util.Date)
     * @return true:是  false:否
     */
    public static boolean isLastDayofMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        Calendar last = Calendar.getInstance();
        calendar.setTime(date);
        last.set(Calendar.DAY_OF_MONTH, last.getActualMaximum(Calendar.DAY_OF_MONTH));

        // 1. 此方法時間精確到秒
        /*if (calendar.compareTo(last) == 0) {
            return true;
        }*/

        // 2. 獲取當月最大天數與當前日期比較
        String start = getDateTimeStr(date, yyyyMMdd);
        String day = start.split("-")[2];
        int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); // 當月最大天數
        if (days == Integer.parseInt(day)) {
            return true;
        }
        return false;
    }

    /**
     * 計算兩時間相距多少天
     *
     * @param startDate 開始時間(最低格式要求:"yyyy-MM-dd")
     * @param endDate   結束時間(最低格式要求:"yyyy-MM-dd")
     * @return 正數:開始時間>結束時間;<br/> 負數:開始時間 < 結束時間<br/> 0:①起止時間相同;②傳入的起止時間為NULL或空字符
     */
    public static Integer calDateApart(String startDate, String endDate) {
        startDate = startDate == null || startDate.isEmpty() ? getDateTimeStr(null, yyyyMMdd) : startDate;
        endDate = endDate == null || endDate.isEmpty() ? getDateTimeStr(null, yyyyMMdd) : endDate;
        DateFormat df = new SimpleDateFormat(yyyyMMdd);
        Date d1 = new Date(), d2 = new Date();
        try {
            d1 = df.parse(startDate);
            d2 = df.parse(endDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        Calendar start = Calendar.getInstance();
        start.setTime(d1);
        Long startTime = start.getTimeInMillis();
        Calendar end = Calendar.getInstance();
        end.setTime(d2);
        Long endTime = end.getTimeInMillis();

        Long oneDay = 1000 * 60 * 60 * 24l, days = (endTime - startTime) / oneDay;
        int day = Integer.parseInt(String.valueOf(days));
        return day;
    }

    /**
     * 取得新的日期
     *
     * @param date 日期
     * @param days 天數
     * @return 新的日期
     */
    public static Date addDays(Date date, long days) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, (int) days);
        return cal.getTime();
    }

    /**
     * 比較兩個時間大小(注意:兩個日期中任意一個傳入了NULL都會返回 0 )
     *
     * @param date1 第一個時間
     * @param date2 第二個時間
     * @return -1:date1 &gt; date2 <br/>  1:date1 &lt; date2; <br/> 0:date1 = date2 或 兩者任一個中傳入了NULL
     */
    public static int compareDay(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return 0;
        }
        long a = date1.getTime(), b = date2.getTime();
        return a < b ? 1 : (a > b ? -1 : 0);
    }

    public static boolean isBefore(Date date1, Date date2) {
        long a = date1.getTime(), b = date2.getTime();
        if (a < b) {
            return true;
        }
        return false;
    }

    /**
     * 得到兩個時間差  格式yyyy-MM-dd HH:mm:ss
     *
     * @param start 2019-06-27 14:12:40
     * @param end   2019-08-27 14:12:40
     * @return 5270400000
     */
    public static long dateSubtraction(String start, String end) {
        SimpleDateFormat df = new SimpleDateFormat(yyyyMMddHHmmss);
        try {
            Date date1 = df.parse(start), date2 = df.parse(end);
            return date2.getTime() - date1.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 獲取當前日期是一個星期的第幾天(注意:星期一為第一天,周日為最后一天)
     *
     * @param date 日期(java.util.Date)
     * @return 2
     */
    public static int getDayOfWeek(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(Calendar.DAY_OF_WEEK) - 1;
    }

    /**
     * 判斷指定時間是否在[startTime, endTime]區間(注意:時間格式要一致)
     *
     * @param nowTime        指定時間
     * @param dateSection 時間區間   2020-01-08,2020-09-09
     * @return true:是,false: 否
     */
    public static boolean isEffectiveDate(Date nowTime, String dateSection) {
        try {
            String[] times = dateSection.split(",");
            Date startTime = new SimpleDateFormat(yyyyMMdd).parse(times[0]);
            Date endTime = new SimpleDateFormat(yyyyMMdd).parse(times[1]);
            if (nowTime.getTime() == startTime.getTime()
                    || nowTime.getTime() == endTime.getTime()) {
                return true;
            }
            Calendar date = Calendar.getInstance();
            date.setTime(nowTime);

            Calendar begin = Calendar.getInstance();
            begin.setTime(startTime);

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

            if (isSameDay(date, begin) || isSameDay(date, end)) {
                return true;
            }
            if (date.after(begin) && date.before(end)) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public static boolean isSameDay(Calendar cal1, Calendar cal2) {
        if (cal1 != null && cal2 != null) {
            return cal1.get(0) == cal2.get(0) && cal1.get(1) == cal2.get(1) && cal1.get(6) == cal2.get(6);
        } else {
            throw new IllegalArgumentException("The date must not be null");
        }
    }

    /**
     * 獲取指定日期前后N個周期
     *
     * @param date   指定日期
     * @param period 周期(限定周期: 天"day",月"month",年"year",周"week")
     * @param count  N (正數:前多少個周期;<br/> 負數:后多少個周期的時間)
     * @return 2019-08-26
     */
    public static String getDatePeriod(Date date, String period, int count) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        if (YEAR.equals(period)) {
            calendar.add(Calendar.YEAR, count);
        } else if (MONTH.equals(period)) {
            calendar.add(Calendar.MONTH, count);
        } else if (WEEK.equals(period)) {
            calendar.add(Calendar.WEEK_OF_MONTH, count);
        } else {
            calendar.add(Calendar.DAY_OF_MONTH, count);
        }
        date = calendar.getTime();
        return new SimpleDateFormat(yyyyMMdd).format(date);
    }

    /**
     * 獲取最近七天(之前的七天)
     *
     * @return 2019-08-20
     */
    public static String getServen() {
        SimpleDateFormat sdf = new SimpleDateFormat(yyyyMMdd);
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DATE, -7);
        Date monday = c.getTime();
        String preMonday = sdf.format(monday);
        return preMonday;
    }

    /**
     * 獲取最近的一個月(之前的一個月)
     *
     * @return
     */
    public static String getPreOneMonth() {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MONTH, -1);
        return new SimpleDateFormat(yyyyMMdd).format(c.getTime());
    }

    /****
     * 獲取月末最后一天
     *
     * @param sDate 2014-11-24
     * @return 30或31或28或29
     */
    private static String getMonthMaxDay(String sDate) {
        Calendar cal = Calendar.getInstance();
        Date date = null;
        try {
            date = new SimpleDateFormat(yyyyMMdd).parse(sDate + "-01");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        cal.setTime(date);
        int last = cal.getActualMaximum(Calendar.DATE);
        return String.valueOf(last);
    }

    /**
     * 日期范圍 - 切片
     * <pre>
     * -- eg:
     * 年 ----------------------- sliceUpDateRange("2018", "2020");
     * rs: [2018, 2019, 2020]
     *
     * 月 ----------------------- sliceUpDateRange("2018-06", "2018-08");
     * rs: [2018-06, 2018-07, 2018-08]
     *
     * 日 ----------------------- sliceUpDateRange("2018-06-30", "2018-07-02");
     * rs: [2018-06-30, 2018-07-01, 2018-07-02]
     * </pre>
     *
     * @param startDate 起始日期
     * @param endDate   結束日期
     * @return 切片日期
     */
    public static List<String> sliceUpDateRange(String startDate, String endDate) {
        List<String> rs = new ArrayList<>();
        try {
            int dt = Calendar.DATE;
            String pattern = "yyyy-MM-dd";
            if (startDate.matches(YEAR_REGEX)) {
                pattern = "yyyy";
                dt = Calendar.YEAR;
            } else if (startDate.matches(MONTH_REGEX)) {
                pattern = "yyyy-MM";
                dt = Calendar.MONTH;
            } else if (startDate.matches(DATE_REGEX)) {
                pattern = "yyyy-MM-dd";
                dt = Calendar.DATE;
            }
            Calendar sc = Calendar.getInstance(), ec = Calendar.getInstance();
            sc.setTime(getDateTime(startDate, pattern));
            ec.setTime(getDateTime(endDate, pattern));
            while (sc.compareTo(ec) < 1) {
                rs.add(getDateTimeStr(sc.getTime(), pattern));
                sc.add(dt, 1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rs;
    }

    /**
     * 獲得本周的最后一天,周日
     *
     * @return
     */
    public static Date getCurrentWeekDayEndTime() {
        Calendar c = Calendar.getInstance();
        try {
            int weekday = c.get(Calendar.DAY_OF_WEEK) - 1;
            if (weekday == 0) {
                weekday = 7;
            }
            c.add(Calendar.DATE, -weekday + 7);
            c.setTime(new SimpleDateFormat().parse(new SimpleDateFormat().format(c.getTime()) + " 23:59:59"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return c.getTime();
    }

    /**
     * 獲得本周的第一天(即周一)
     *
     * @return
     */
    public static Date getCurrentWeekDayStartTime() {
        Calendar c = Calendar.getInstance();
        try {
            int weekday = c.get(Calendar.DAY_OF_WEEK) - 1;
            if (weekday == 0) {
                weekday = 7;
            }
            c.add(Calendar.DATE, -weekday + 1);
            c.setTime(new SimpleDateFormat().parse(new SimpleDateFormat().format(c.getTime()) + " 00:00:00"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return c.getTime();
    }

    /**
     * 獲得指定日期所在日的開始時間
     *
     * @return
     */
    public static String getCurrentDayStartTime(Date date) {
        String result = (date == null)
                ? new SimpleDateFormat(yyyyMMdd).format(System.currentTimeMillis())
                : getDateTimeStr(date, yyyyMMdd);
        return result.concat(" 00:00:00");
    }

    /**
     * 獲得指定日期所在日的結束時間
     *
     * @return
     */
    public static String getCurrentDayEndTime(Date date) {
        String result = (date == null)
                ? new SimpleDateFormat(yyyyMMdd).format(System.currentTimeMillis())
                : getDateTimeStr(date, yyyyMMdd);
        return result.concat(" 23:59:59");
    }

    /**
     * 根據日期范圍,得到按周期划分的日期區間值
     *
     * @param dateRange 格式最低要求有年月日,例如:"2020-01-01,2020-03-31"
     * @param period    周期(日"day",月"month",年"year")
     * @return 小區間集合
     */
    public static List<String> getPeriodDateList(String dateRange, String period) {
        String startDate = dateRange.trim().split(",")[0], endDate = dateRange.trim().split(",")[1];
        Date start = getDateTime(startDate, yyyyMMdd), end = getDateTime(endDate, yyyyMMdd);
        List<String> result = new ArrayList<>();
        if (DAY.equals(period)) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(start);
            while (start.before(end) || start.equals(end)) {
                result.add(new SimpleDateFormat(yyyyMMdd).format(calendar.getTimeInMillis()));
                // calendar.getTimeInMillis();
                // String startTmp = getCurrentDayStartTime(start), endTmp = getCurrentDayEndTime(start);
                // result.add(startTmp.concat(",").concat(endTmp));
                calendar.add(Calendar.DATE, 1);
                start = calendar.getTime();
            }
        } else if (MONTH.equals(period)) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(start);
            while (start.before(end) || start.equals(end)) {
                result.add(new SimpleDateFormat("yyyy-MM").format(calendar.getTimeInMillis()));
                calendar.add(Calendar.MONTH, 1);
                start = calendar.getTime();
            }
        } else if (YEAR.equals(period)) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(start);
            while (start.before(end) || start.equals(end)) {
                result.add(new SimpleDateFormat("yyyy").format(calendar.getTimeInMillis()));
                calendar.add(Calendar.YEAR, 1);
                start = calendar.getTime();
            }
        }
        return result;
    }

    /**
     * 獲取指定日期前后count天的集合
     *
     * @param date  指定日期
     * @param count 多少天(正數:之后;負數:之前)
     * @return 前/后日期的集合(包含指定日期)
     */
    public static List<String> getDayList(Date date, int count) {
        List<String> result = new ArrayList<>();
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        boolean flag = false;
        if (count < 0) {
            count = Math.abs(count);
            flag = true;
        }
        for (int i = 0; i < count; i++) {
            result.add(new SimpleDateFormat(yyyyMMdd).format(c.getTimeInMillis()));
            c.add(Calendar.DATE, flag ? -1 : 1);
        }
        if (flag){
            Collections.reverse(result);
        }
        return result;
    }

    public static void main(String[] args) {
//        Date date = new Date(), dateDemo = getDateTime("2020-01-30 23:33:21", yyyyMMddHHmmss);
//        String dateStr = "2020-02-01", timeStr = "23:33:21", dateTimeStr = "2020-01-30 23:33:21";
//        String dateStr2 = "2020-01-31", timeStr2 = "23:33:21", dateTimeStr2 = "2020-01-30 23:33:21";
//        String dateRange = "2020-01-01,2020-02-05";
        System.out.println(getDayList(new Date(), -7));
//        System.out.println(getPeriodDateList(dateRange, DAY));
//        System.out.println(getCurrentDayStartTime(dateDemo));
//        System.out.println(getCurrentDayEndTime(dateDemo));
//        System.out.println(getDateTimeStr(getCurrentWeekDayStartTime(), yyyyMMdd));
//        System.out.println(getDateTimeStr(getCurrentWeekDayEndTime(), yyyyMMdd));
//        System.out.println(sliceUpDateRange(dateRange.trim().split(",")[0], dateRange.trim().split(",")[1]));
//        System.out.println(getPeriodDateList(dateRange, DAY));
//        System.out.println(getDateTimeStr(null, "hh mm ss"));
//        System.out.println(getDateTime(dateTimeStr, yyyyMMddHHmmss));
//        System.out.println(getTimestamp());
//        System.out.println(getDateTime(yyyyMMdd, System.currentTimeMillis()));
//        System.out.println(timestamp2DateTime(yyyyMMddHHmmss, System.currentTimeMillis()));
//        System.out.println(isLastDayofMonth(getDateTime(dateStr, yyyyMMdd)));
//        System.out.println(calDateApart(dateStr, dateStr));
//        System.out.println(compareDay(getDateTime(dateStr, yyyyMMdd), getDateTime(dateStr2, yyyyMMdd)));
//        System.out.println(getDateTimeStr(addDays(date, 3), yyyyMMdd));
//        System.out.println(dateSubtraction(dateTimeStr, dateTimeStr2));
//        System.out.println(getDayOfWeek(date));
//        System.out.println(isEffectiveDate(getDateTime(dateTimeStr, yyyyMMdd), dateStr.concat(",").concat(dateStr2)));
//        System.out.println(getDatePeriod(date, WEEK, -4));
//        System.out.println(getServen());
//        System.out.println(getPreOneMonth());
//        System.out.println(getMonthMaxDay(dateStr));
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM