Java 時間類 Date、Calendar 及用法

HuDu發表於2020-09-02

時間類介紹

在java中,時間類主要有DateCalendar,暫時只介紹java.util.*下的時間類,對於java.sql.*下的先不做介紹。
主要內容有以下幾個。

  • 1、如何獲取當前時間引數
  • 2、如何過去某一個月第一天和最後一天
  • 3、如何加減日期
  • 4、獲取兩個時間之間的時間差
    首先,我們需要了解API下對其的介紹,對於Date,很多方法已經過時遷移到了Calendar類上,但是這是最初的時間類,構造方法主要介紹兩種即
    Date date= new Date();//分配物件並初始話
    Date date= new Date(long date)//分配 Date 物件並初始化此物件,以表示自從標準基準時間(稱為“曆元(epoch)”,即 1970 年 1 月 1 日00:00:00 GMT)以來的指定毫秒數。
    可以看得出來,Date是以曆元為標準的,簡單的驗證下你的猜想。new Date().getYear() 的值是  120 然而今年是 2020
    對於Calendar,與Date不同的是,他對Date的時間曆元進行偏移,要是看括號裡的有點暈可不看。API(Calendar 類是一個抽象類,它為特定瞬間與一組諸如 YEARMONTHDAY_OF_MONTHHOUR 等 日曆欄位之間的轉換提供了一些方法,併為操作日曆欄位(例如獲得下星期的日期)提供了一些方法。瞬間可用毫秒值來表示,它是距曆元(即格林威治標準時間 197011 日的 00:00:00.000,格里高利曆)的偏移量)。
  Calendar不得不說的就是類方法 getInstance,Calendar 的 getInstance 方法返回一個 Calendar 物件,其日曆欄位已由當前日期和時間初始化

Calendar rightNow = Calendar.getInstance();

實踐

  • 1.如何獲取當前引數
public void getCurrentTime() {
        Date NowDate = new Date();
        //具體日期格式後面自己修改,HH代表24小時制,hh代表12小時制,
        SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd a hh:mm:ss");
        String CurrentTime1 = formatter1.format(NowDate);
        String CurrentTime2 = formatter2.format(NowDate);
        System.out.println(CurrentTime1);
        System.out.println(CurrentTime2);
    }

輸出結果:

2020-09-02 08:45:25
2020-09-02 上午 08:45:25
  • 2.如何獲取某個月的第一天和最後一天
//獲取某年某月的最後一天
    //注意月份是按0---11總共12個月,不是從1開始的,但是一個月幾號第幾天卻是從1開始的

    /**
     * @param year  對應的年份
     * @param month 對應的月份
     * @return
     */
    public static String getLastDayOfMonth(int year,int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR,year);
        calendar.set(Calendar.MONTH,month-1);
        calendar.set(Calendar.DAY_OF_MONTH,calendar.getActualMaximum(Calendar.DATE));

        SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
        String date = sdf.format(calendar.getTime());

        return date;
    }

    //獲取某年某月的第一天
    public static String getFirstDayOfMonth(int year,int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR,year);
        calendar.set(Calendar.MONTH,month-1);
        calendar.set(Calendar.DAY_OF_MONTH,calendar.getActualMinimum(Calendar.DATE));

        SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
        String date = sdf.format(calendar.getTime());

        return date;
    }

測試:

public void test() {
        String firstDayOfMonth = CalendarUtil.getFirstDayOfMonth(2020, 9);
        String lastDayOfMonth = CalendarUtil.getLastDayOfMonth(2020, 9);
        System.out.println(firstDayOfMonth+"---"+lastDayOfMonth);
    }

輸出結果

2020-09-01---2020-09-30
  • 3.如何加減日期
Calendar類中提供了add方法
add(f, delta)將 delta 新增到 f 欄位中,主要有兩個規則

Add 規則 1: 呼叫後 f 欄位的值減去呼叫前 f 欄位的值等於 delta,以欄位 f 中發生的任何溢位為模。溢位發生在欄位值超出其範圍時,結果,下一個更大的欄位會遞增或遞減,並將欄位值調整回其範圍內。

Add 規則 2: 如果期望某一個更小的欄位是不變的,但讓它等於以前的值是不可能的,因為在欄位 f 發生更改之後,或者在出現其他約束之後,比如時區偏移量發生更改,它的最大值和最小值也在發生更改,然後它的值被調整為儘量接近於所期望的值。更小的欄位表示一個更小的時間單元。HOUR 是一個比 DAY_OF_MONTH 小的欄位。對於不期望是不變欄位的更小欄位,無需進行任何調整。日曆系統會確定期望不變的那些欄位。

程式碼示例:

//往後n天的日期
    public static String getTargetDay(int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH,+day);
        Date time = calendar.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String date = sdf.format(time);

        return date;
    }

測試:

public void test5() {
        String targetDay1 = CalendarUtil.getTargetDay(20);
        String targetDay2 = CalendarUtil.getTargetDay(-20);
        System.out.println(targetDay1);
        System.out.println(targetDay2);
    }

結果:

例如現在是92日,往後推20天就是22日,往前推20天就是8132020-09-22
2020-08-13
  • 4.獲取兩個時間之間的時間差
方法很多,就不贅述了,主要是將時間轉化為時間時間戳,最後通過兩個時間對應的時間戳進行計算。最後將 long 型別的時間戳轉換為自己需要的時間的格式
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章