天天看點

日期操作工具類集合日期操作工具類集合

日期操作工具類集合

今天有空遂整理了下最近做項目用到的日期操作工具類,做下記錄,也供大家參考和指正。

注意:

本工具類為非線程安全的,多線程調用請根據實際情況自行修改。

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author will
 * @2019/2/25 14:52
 * 檔案說明:日期時間操作工具類
 */
@Slf4j
public class TimeUtils {
    /**
     * 字元串轉日期
     *
     * @param dateStr 日期字元串
     * @param format  格式,比如yyyy-MM-dd HH:mm:ss、yyyy-MM-dd
     * @return
     */
    public static Date formatDate(String dateStr, String format) {
        Date result = null;
        try {
            if (StringUtils.isBlank(dateStr)) {
                throw new Exception("日期字元串不能為空");
            }
            if (StringUtils.isBlank(format)) {
                throw new Exception("日期格式化格式不能為空");
            }
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            result = sdf.parse(dateStr);
        } catch (Exception e) {
            log.error("字元串轉日期異常 {}", e);
        }
        return result;
    }

    /**
     * 日期轉字元串
     *
     * @param dateStr 日期
     * @param format  格式,比如yyyy-MM-dd HH:mm:ss、yyyy-MM-dd
     * @return
     */
    public static String formatSting(Date dateStr, String format) {
        String result = null;
        try {
            if (null == dateStr) {
                throw new Exception("日期不能為空");
            }
            if (StringUtils.isBlank(format)) {
                throw new Exception("日期格式化格式不能為空");
            }
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            result = sdf.format(dateStr);
        } catch (Exception e) {
            log.error("日期轉字元串異常 {}", e);
        }
        return result;
    }


    /**
     * 擷取目前時間的上幾周或者下幾周某天日期
     *
     * @param n    n為推遲的周數,0本周,-1向前推遲一周,1下周,依次類推
     * @param week 想周幾,這裡就傳幾,請使用Calendar的常量,如Calendar.MONDAY(TUESDAY、WEDNESDAY...)
     * @param date 日期
     * @return
     */
    public static String getBeforeAfterWeek(int n, int week, Date date) {
        String monday = null;
        try {
            if (date == null) {
                throw new Exception("日期不能為空");
            }
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            cal.add(Calendar.DATE, n * 7);
            cal.set(Calendar.DAY_OF_WEEK, week);
            monday = formatSting(cal.getTime(), "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("擷取上周或下周某天日期失敗 {}", e);
        }
        return monday;
    }


    /**
     * 擷取傳入日期傳回當月的最後一天的日期,如傳入2018-6-11傳回2018-6-30
     *
     * @param date 日期
     * @return
     */
    public static String getThisMothLastDay(Date date) {
        String lastDayOfMonth = null;
        try {
            if (date == null) {
                throw new Exception("日期不能為空");
            }
            Calendar thisMonthDayNum = Calendar.getInstance();
            thisMonthDayNum.setTime(date);
            //把日期設定為當月第一天
            thisMonthDayNum.set(Calendar.DATE, 1);
            //日期復原一天,也就是最後一天
            thisMonthDayNum.roll(Calendar.DATE, -1);
            int lastDay = thisMonthDayNum.get(Calendar.DAY_OF_MONTH);
            //設定月曆中月份的最大天數
            thisMonthDayNum.set(Calendar.DAY_OF_MONTH, lastDay);
            //格式化日期
            lastDayOfMonth = formatSting(thisMonthDayNum.getTime(), "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("擷取傳入日期當月最後一天異常 {}", e);
        }
        return lastDayOfMonth;
    }

    /**
     * 擷取傳入日期傳回當月第一天的日期,如傳入2018-6-11傳回2018-6-01
     *
     * @param date 日期
     * @return
     */
    public static String getThisMothFirstDay(Date date) {
        String lastDayOfMonth = null;
        try {
            if (date == null) {
                throw new Exception("日期不能為空");
            }
            Calendar thisMonthDayNum = Calendar.getInstance();
            thisMonthDayNum.setTime(date);
            //把日期設定為當月第一天
            thisMonthDayNum.set(Calendar.DATE, 1);
            lastDayOfMonth = formatSting(thisMonthDayNum.getTime(), "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("擷取傳入日期當月第一天異常 {}", e);
        }
        return lastDayOfMonth;
    }

    /**
     * 擷取傳入日期上個月的最後一天,如傳入2018-6-11傳回2018-5-31
     *
     * @param date
     * @return
     */
    public static String getLastOneMothLastDay(Date date) {
        String lastMonthStr = null;
        try {
            if (date == null) {
                throw new Exception("日期不能為空");
            }
            Calendar lastMonthDay = Calendar.getInstance();
            lastMonthDay.setTime(date);
            lastMonthDay.set(Calendar.DAY_OF_MONTH, 1);
            lastMonthDay.add(Calendar.DAY_OF_YEAR, -1);
            lastMonthStr = DateFormatUtils.format(lastMonthDay, "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("擷取傳入日期上個月最後一天異常 {}", e);
        }
        return lastMonthStr;
    }


    /**
     * 擷取傳入日期上個月的第一天,如傳入2018-6-11傳回2018-5-1
     *
     * @param date
     * @return
     */
    public static String getLastOneMothFirstDay(Date date) {
        String lastMonthStr = null;
        try {
            if (date == null) {
                throw new Exception("日期不能為空");
            }
            Calendar lastMonthDay = Calendar.getInstance();
            lastMonthDay.setTime(date);
            lastMonthDay.set(Calendar.DAY_OF_MONTH, 1);
            lastMonthDay.add(Calendar.DAY_OF_YEAR, -1);
            //把日期設定為當月第一天
            lastMonthDay.set(Calendar.DATE, 1);
            lastMonthStr = DateFormatUtils.format(lastMonthDay, "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("擷取傳入日期上個月第一天異常 {}", e);
        }
        return lastMonthStr;
    }

    /**
     * 擷取年某某月有多少天
     *
     * @param year
     * @param month
     * @return
     */
    public static Integer dayNum(Integer year, Integer month) {
        Integer day = null;
        try {
            Calendar c = Calendar.getInstance();
            //輸入類型為int類型
            c.set(year, month, 0);
            return c.get(Calendar.DAY_OF_MONTH);
        } catch (NumberFormatException e) {
            log.error("擷取年某某月有多少天異常 {}", e);
        }
        return day;
    }


    /**
     * 獲得本周一與目前日期相差的天數
     *
     * @return
     */
    public static int getMondayPlus() {
        Calendar cd = Calendar.getInstance();
        int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK);
        if (dayOfWeek == 1) {
            return -6;
        } else {
            return 2 - dayOfWeek;
        }
    }


    /**
     * 獲得目前周周一的日期
     *
     * @return
     */
    public static String getCurrentMonday() {
        int mondayPlus = getMondayPlus();
        GregorianCalendar currentDate = new GregorianCalendar();
        currentDate.add(GregorianCalendar.DATE, mondayPlus);
        Date monday = currentDate.getTime();
        String preMonday = formatSting(monday, "yyyy-MM-dd");
        return preMonday;
    }

    /**
     * 獲得目前周周日的日期
     *
     * @return
     */
    public static String getPreviousSunday() {
        int mondayPlus = getMondayPlus();
        GregorianCalendar currentDate = new GregorianCalendar();
        currentDate.add(GregorianCalendar.DATE, mondayPlus + 6);
        Date monday = currentDate.getTime();
        String preMonday = formatSting(monday, "yyyy-MM-dd");
        return preMonday;

    }

    /**
     * 擷取目前系統前一天日期
     *
     * @return
     */
    public static String getBeforeOneDay() {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        date = calendar.getTime();
        String day = DateFormatUtils.format(date, "yyyy-MM-dd");
        return day;
    }

    /**
     * 獲得指定日期的前一天
     *
     * @param specifiedDay
     * @return
     * @throws Exception
     */
    public static String getSpecifiedDayBefore(String specifiedDay) {
        String dayBefore = null;
        try {
            Calendar c = Calendar.getInstance();
            Date date = null;
            date = formatDate(specifiedDay, "yy-MM-dd");
            c.setTime(date);
            int day = c.get(Calendar.DATE);
            c.set(Calendar.DATE, day - 1);
            dayBefore = formatSting(c.getTime(), "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("獲得指定日期的前一天異常 {}", e);
        }
        return dayBefore;
    }


    /**
     * 獲得指定日期本周一的日期
     *
     * @param time
     * @return
     */
    public static String getWeekFirst(String time) {
        String data1 = null;
        try {
            Calendar cal = Calendar.getInstance();
            cal.setTime(formatDate(time, "yyyy-MM-dd"));
            int d = 0;
            if (cal.get(Calendar.DAY_OF_WEEK) == 1) {
                d = -6;
            } else {
                d = 2 - cal.get(Calendar.DAY_OF_WEEK);
            }
            cal.add(Calendar.DAY_OF_WEEK, d);
            // 所在周開始日期
            data1 = formatSting(cal.getTime(), "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("獲得指定日期周一異常 {}", e);
        }
        return data1;
    }

    /**
     * 獲得指定日期本周日的日期
     *
     * @param time
     * @return
     */
    public static String getWeekLast(String time) {
        String imptimeMi = null;
        try {
            Calendar cal = Calendar.getInstance();
            cal.setTime(formatDate(time, "yyyy-MM-dd"));
            //判斷要計算的日期是否是周日,如果是則減一天計算周六的,否則會出問題,計算到下一周去了
            //獲得目前日期是一個星期的第幾天
            int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
            if (1 == dayWeek) {
                cal.add(Calendar.DAY_OF_MONTH, -1);
            }
            //設定一個星期的第一天,按中國的習慣一個星期的第一天是星期一
            cal.setFirstDayOfWeek(Calendar.MONDAY);
            //獲得目前日期是一個星期的第幾天
            int day = cal.get(Calendar.DAY_OF_WEEK);
            //根據月曆的規則,給目前日期減去星期幾與一個星期第一天的內插補點
            cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
            cal.add(Calendar.DATE, 6);
            imptimeMi = formatSting(cal.getTime(), "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("獲得指定日期本周日的日期異常 {}", e);
        }
        return imptimeMi;
    }

    /**
     * 獲得指定日期周一,動态加減天數
     *
     * @param time
     * @param num  加減天數,減則為-
     * @return
     */
    public static String getTuesday(String time, int num) {
        String imptimeMi = null;
        try {
            Calendar cal = Calendar.getInstance();
            cal.setTime(formatDate(time, "yyyy-MM-dd"));
            //判斷要計算的日期是否是周日,如果是則減一天計算周六的,否則會出問題,計算到下一周去了
            //獲得目前日期是一個星期的第幾天
            int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
            if (1 == dayWeek) {
                cal.add(Calendar.DAY_OF_MONTH, -1);
            }
            //設定一個星期的第一天,按中國的習慣一個星期的第一天是星期一
            cal.setFirstDayOfWeek(Calendar.MONDAY);
            //獲得目前日期是一個星期的第幾天
            int day = cal.get(Calendar.DAY_OF_WEEK);
            //根據月曆的規則,給目前日期減去星期幾與一個星期第一天的內插補點
            cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
            cal.add(Calendar.DATE, num);
            imptimeMi = formatSting(cal.getTime(), "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("獲得指定日期周一,動态加減天數,異常 {}", e);
        }
        return imptimeMi;
    }

    /**
     * 擷取某個日期當天的開始時間,2019-05-10 00:00:00.0
     *
     * @param d
     * @return
     */
    public static Timestamp getDayStartTime(Date d) {
        Calendar calendar = Calendar.getInstance();
        if (null != d) calendar.setTime(d);
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return new Timestamp(calendar.getTimeInMillis());
    }


    /**
     * 擷取某個日期當天的結束時間,2019-05-10 23:59:59.999
     *
     * @param d
     * @return
     */
    public static Timestamp getDayEndTime(Date d) {
        Calendar calendar = Calendar.getInstance();
        if (null != d) calendar.setTime(d);
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return new Timestamp(calendar.getTimeInMillis());
    }


    /**
     * 擷取指定日期上周的開始時間
     *
     * @param time
     * @return
     */
    public static String getBeginDayOfLastWeek(String time) {
        String r = null;
        try {
            if (time == null) {
                throw new Exception("日期不能為空");
            }
            Calendar cal = Calendar.getInstance();
            cal.setTime(formatDate(time, "yyyy-MM-dd"));
            int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
            if (dayofweek == 1) {
                dayofweek += 7;
            }
            cal.add(Calendar.DATE, 2 - dayofweek - 7);
            r = formatSting(cal.getTime(), "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("擷取指定日期上周的開始時間異常 {}", e);
        }
        return r;
    }

    /**
     * 擷取指定日期上周的結束時間
     *
     * @param time
     * @return
     */
    public static String getEndDayOfLastWeek(String time) {
        String day = null;
        try {
            if (time == null) {
                throw new Exception("日期不能為空");
            }
            Calendar cal = Calendar.getInstance();
            cal.setTime(formatDate(getBeginDayOfLastWeek(time), "yyyy-MM-dd"));
            cal.add(Calendar.DAY_OF_WEEK, 6);
            Date weekEndSta = cal.getTime();
            day = formatSting(weekEndSta, "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("擷取指定日期上周的結束時間異常 {}", e);
        }
        return day;
    }


    /**
     * 給定某日期,判斷是星期幾
     *
     * @param date
     * @return
     */
    public static String getTimeToWeek(String date) {
        SimpleDateFormat sdw = null;
        Date d = null;
        try {
            if (date == null) {
                throw new Exception("日期不能為空");
            }
            sdw = new SimpleDateFormat("E");
            d = null;
            d = formatDate(date, "yyyy-MM-dd");
        } catch (Exception e) {
            log.error("給定某日期,判斷是星期幾異常 {}", e);
        }
        return sdw.format(d);
    }


    /**
     * 通過時間秒毫秒數判斷兩個時間的間隔
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int differentDaysByMillisecond(Date date1, Date date2) {
        int days = (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
        return days;
    }


    /**
     * 擷取兩個日期之間的日期,包括開始結束日期
     *
     * @param start 開始日期
     * @param end   結束日期
     * @return 日期集合
     */
    public static List<Date> getBetweenDates(Date start, Date end) {
        List<Date> result = new ArrayList<Date>();
        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(start);
        tempStart.add(Calendar.DAY_OF_YEAR, 1);
        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(end);
        result.add(start);
        while (tempStart.before(tempEnd)) {
            result.add(tempStart.getTime());
            tempStart.add(Calendar.DAY_OF_YEAR, 1);
        }
        result.add(end);
        return result;
    }


    /**
     * 日期轉時間戳
     *
     * @param date
     * @return
     */
    public static Integer transForMilliSecond(Date date) {
        try {
            if (date == null) throw new Exception("日期不能為空");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (int) (date.getTime() / 1000);
    }


    /**
     * 日期字元串轉時間戳,可動态加減日期
     *
     * @param dateStr
     * @return
     */
    public static Integer transForMilliSecond2(String dateStr, int num) {
        Date date = TimeUtils.formatDate(dateStr, "yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, num);
        return date == null ? null : TimeUtils.transForMilliSecond(calendar.getTime());
    }

    /**
     * 日期字元串動态加減日期
     *
     * @param dateStr
     * @return
     */
    public static String timeAddSub(String dateStr, int num) {
        Date date = TimeUtils.formatDate(dateStr, "yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, num);
        Date date1 = calendar.getTime();
        return TimeUtils.formatSting(date1, "yyyy-MM-dd");
    }

    /**
     * 日期字元串動态加減日期
     *
     * @param dateStr
     * @param num
     * @param fomt    格式
     * @return
     */
    public static String timeAddSub(String dateStr, int num, String fomt) {
        Date date = TimeUtils.formatDate(dateStr, fomt);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, num);
        Date date1 = calendar.getTime();
        return TimeUtils.formatSting(date1, fomt);
    }

}