JAVA造輪子之-日期工具類

Java經常使用日期工具類,常規的日期、時間格式轉換,字符串轉Date對象,Date對象轉字符串,日期比較,日期添加指定年、月、天等,計算兩個日期之間相差的天數、月數、年數等;java

DateUtils.java工具

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author JL
 * @version V1.0
 * @Description 用java.util.Calendar封裝日期、時間操做工具類
 */
public class DateUtils {

    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static final String YYYY_MM_DD = "yyyy-MM-dd";
    public static final String HH_MM_SS = "HH:mm:ss";

    public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
    public static final String YYYYMMDD = "yyyyMMdd";
    public static final String HHMMSS = "HHmmss";

    public static String getTimeStr(Date date, String pattern){
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }

    public static String getTimeStr(String pattern){
        return getTimeStr(new Date(), pattern);
    }

    public static String getTimeStr(Date date){
        return getTimeStr(date, YYYY_MM_DD_HH_MM_SS);
    }

    public static String getTimeStr(){
        return getTimeStr(new Date(), YYYY_MM_DD_HH_MM_SS);
    }

    public static String getDateStr(Date date){
        return getTimeStr(date, YYYY_MM_DD);
    }

    public static String getDateStr(){
        return getTimeStr(new Date(), YYYY_MM_DD);
    }

    public static Long getTimeToLong(){
        return Long.parseLong(getTimeStr(new Date(), YYYYMMDDHHMMSS));
    }

    public static Long getTimeToLong(String timeStr){
        timeStr = timeStr.replaceAll("-","");
        timeStr = timeStr.replaceAll("/","");
        timeStr = timeStr.replaceAll(" ","");
        timeStr = timeStr.replaceAll(":","");
        return Long.parseLong(timeStr);
    }

    public static Long getTimeToLong(Date date){
        return Long.parseLong(getTimeStr(date, YYYYMMDDHHMMSS));
    }

    public static Date getTime(String timeStr, String pattern){
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try{
            return sdf.parse(timeStr);
        }catch(ParseException pe){
            System.out.println("時間格式不對:" + pe.getMessage());
        }
        return null;
    }

    public static Date getTime(String timeStr){
        return getTime(timeStr, YYYY_MM_DD_HH_MM_SS);//默認YYYY_MM_DD_HH_MM_SS
    }

    public static Date getDate(String dateStr){
        return getTime(dateStr, YYYY_MM_DD);//默認YYYY_MM_DD
    }

    public static int getYear(){
        return Calendar.getInstance().get(Calendar.YEAR);
    }

    public static int getMonth(){
        return Calendar.getInstance().get(Calendar.MONTH) + 1;
    }

    public static int getDay(){
        return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
    }

    public static Date addDayDate(int amount){
        return addTimeDate(Calendar.DAY_OF_MONTH, amount);
    }

    public static int addDay(int amount){
        return addTime(Calendar.DAY_OF_MONTH, amount);
    }

    public static Date addMonthDate(int amount){
        return addTimeDate(Calendar.MONTH, amount);
    }

    public static int addMonth(int amount){
        return addTime(Calendar.MONTH, amount);
    }

    public static Date addYearDate(int amount){
        return addTimeDate(Calendar.YEAR, amount);
    }

    public static int addYear(int amount){
        return addTime(Calendar.YEAR, amount);
    }

    public static Date addMillisecondDate(long amout){
        return new Date(addMillisecond(amout));
    }

    public static long addMillisecond(long amout){
        return new Date().getTime() + amout;
    }

    //按不一樣的單位,添加時間值,返回添加後的時間值
    public static int addTime(int field, int amount){
        Calendar calendar = Calendar.getInstance();
        calendar.add(field, amount);
        return calendar.get(field);
    }

    //按不一樣的單位,添加時間值,返回date對象
    public static Date addTimeDate(int field, int amount){
        Calendar calendar = Calendar.getInstance();
        calendar.add(field, amount);
        return calendar.getTime();
    }

    //相差年數(按月數統計,若是不按月數統計,直接取年份相減便可)
    public static int differYear(Date date1, Date date2){
        int dMonth = differMonth(date1, date2);
        return dMonth > 0 ? dMonth / 12 : 0;
    }

    //相差月數(精確到天)
    public static int differMonth(Date date1, Date date2){
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(date1);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(date2);
        //年相減 * 12 + 月相減
        int year = calendar1.get(Calendar.YEAR) - calendar2.get(Calendar.YEAR);
        int month = calendar1.get(Calendar.MONTH) - calendar2.get(Calendar.MONTH);
        int day = calendar1.get(Calendar.DAY_OF_MONTH) - calendar2.get(Calendar.DAY_OF_MONTH);
        //按天然天推算,如:本月25號,到下月5號,只相差10天(按30天計算),不足一個月,須要減一個月
        //大於1,是由於按天,一個月從1號到30號算一個完整月,到下個月1號,已經多了一天
        //說明,day2在day1的前面2天,相差的天數,不足一個月,如:本月25號到下月24號爲一個完整天然月;
        if (day > 1){
            return year * 12 + month - 1;
        }
        return year * 12 + month;
    }

    //相差天數
    public static long differDay(Date date1, Date date2){
        long time = date1.getTime() - date2.getTime();
        return time / (1000*60*60*24);
    }

    //是否同一天,無論時分秒
    public static boolean isSameDay(Date date1, Date date2){
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);
        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
        return cal1.get(0) == cal2.get(0) && cal1.get(1) == cal2.get(1) && cal1.get(6) == cal2.get(6);
    }

    //是否同一天,毫秒級
    public static boolean isSameInstant(Date date1, Date date2){
        return date1.getTime() == date2.getTime();
    }

    //一週中的第幾天,默認從週日(0)開始計算
    public static int getWeek(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(Calendar.DAY_OF_WEEK);
    }

    //一年中的第幾個季度
    public static int getSeason(Date date) {
        int season = 1;
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int month = c.get(Calendar.MONTH);
        switch (month) {
            case Calendar.JANUARY:
            case Calendar.FEBRUARY:
            case Calendar.MARCH:
                season = 1;
                break;
            case Calendar.APRIL:
            case Calendar.MAY:
            case Calendar.JUNE:
                season = 2;
                break;
            case Calendar.JULY:
            case Calendar.AUGUST:
            case Calendar.SEPTEMBER:
                season = 3;
                break;
            case Calendar.OCTOBER:
            case Calendar.NOVEMBER:
            case Calendar.DECEMBER:
                season = 4;
                break;
        }
        return season;
    }

    public static void main(String[] args) {
        System.out.println(getYear()+"\t"+getMonth()+"\t"+getDay());
        System.out.println(getTimeToLong());
        System.out.println(getTimeToLong("2019-01-12 22:10:01"));
        System.out.println(getTimeToLong("2019/01/12 22:10:01"));
        System.out.println(getTimeToLong(new Date()));
        System.out.println(getTimeStr(new Date(),HH_MM_SS));
        System.out.println(addDay(-13));
        System.out.println(addMillisecond(15000));
        System.out.println(getTimeStr(addDayDate(-5)));
        System.out.println(differDay(getTime("2019-06-25 20:00:00"), getTime("2019-06-20 21:59:59")));
        System.out.println(differYear(getTime("2019-06-25 20:00:00"), getTime("2017-06-26 21:59:59")));
        System.out.println(getWeek(new Date()));
    }

}

說明:學習

作過項目的人都知道,不少寫過的可重複利用的代碼塊或有用的工具類沒有怎麼整理,當須要的時候,又得打開項目查找一翻,雖然功能開發不難,可是又得花時間成本去寫去測試,這樣的重複造輪子的事情太屢次了;所以不如把輪子保留,供你們一塊兒使用;測試

1.這個輪子能夠有:須要使用的時候確實還不存在這個組件。
2.我須要的時候輪子不在:每一種技術或工具產生都有它的項目背景,當代碼寫在項目裏的時候,我知道有這個東西,當換了一個項目或公司後,沒有備份也沒有記錄,這個時候你不在了,又得花時間手打一遍;
3.我不知道是否是造輪子:大多數狀況下初學者很難分清楚本身是否是在重複造輪子,事實上造輪子不是我目的。個人目的是完成工做任務,任務完成的速度越快越好,質量越高越好。而不是去判斷本身在不在造輪子。
4.不想重複花時間造輪子:有時候還會碰到一些並不困難可是很佔時間的東西,固然有現成的輪子是花時間最少的;
5.我就是想學習輪子:初學者的並非在重複造輪子,而是學習後以提升爲本身的知識與技能。code

輪子有過測試,但不免有失誤,若有錯誤處,還敬請指出;orm

相關文章
相關標籤/搜索