Java中日期的幾種常見操作 —— 取值、轉換、加減、比較

Java中日期的幾種常見操作 —— 取值、轉換、加減、比較

1. 日期取值

在舊版本 JDK 的時代,有不少代碼中日期取值利用了 java.util.Date 類,但是由於 Date 類不便於實現國際化,其實從 JDK1.1 開始,就更推薦使用 java.util.Calendar 類進行時間和日期方面的處理。這裏便不介紹 Date 類的操作,讓我們直奔主題吧,如何利用 Calendar 類取得現在的日期時間。

由於 Calendar 的構造器方法被 protected 修飾,所以我們會通過 API 中提供的 getInstance 方法來創建 Calendar 對象。

//有多個重載方法創建 Calendar 對象
Calendar now = Calendar.getInstance(); //默認
//指定時區和地區,也可以只輸入其中一個參數
Calendar now = Calendar.getInstance(timeZone, locale);

然後我們就可以通過該對象取得當前的各種時間參數了。

int year = now.get(Calendar.YEAR); //2015,當前年份
int month = now.get(Calendar.MONTH) + 1; //12,當前月,注意加 1
int day = now.get(Calendar.DATE); //23,當前日
Date date = now.getTime(); //直接取得一個 Date 類型的日期

要取得其他類型的時間數據僅需修改 now.get() 內的參數,除了以上三種參數,其他常用參數如下:

  • Calendar.DAY_OF_MONTH:日期,和 Calendar.DATE 相同

  • Calendar.HOUR:12 小時制的小時數

  • Calendar.HOUR_OF_DAY:24小時制的小時數

  • Calendar.MINUTE:分鐘

  • Calendar.SECOND:秒

  • Calendar.DAY_OF_WEEK:周幾

除了取得時間數據,我們也可以通過 Calendar 對象設置各種時間參數。

//只設定某個字段的值
// public final void set(int field, int value)
now.set(Calendar.YEAR, 2016);
//設定年月日或者年月日時分或年月日時分秒
// public final void set(int year, int month, int date[, int hourOfDay, int minute, int second])
now.set(2016, 1, 1[, 11, 1, 1]);
//直接傳入一個 Date 類型的日期
// public final void setTime(Date date)
now.set(date);

注意:

  • 當設置了時間參數後,其他相關的數值都會重新計算,例如當你把日期設爲 11 號後,周幾就會作對應變化。

  • 獲得的月份加 1 纔是實際月份。

  • 在 Calendar 類中,週日是 1,週一是 2,以此類推。

2. 日期轉換

聊完日期取值,接下來聊聊日期轉換,轉換一般是 Date 型日期與 String 型字符串之間的相互轉換,我主要利用 java.text.SimpleDateFormat 進行轉換操作。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    //日期轉字符串
    Calendar calendar = Calendar.getInstance();
    Date date = calendar.getTime();
    String dateStringParse = sdf.format(date);
    //字符串轉日期
    String dateString = "2016-01-01 11:11:11";
    Date dateParse = sdf.parse(dateString);
} catch (ParseException e) {
     e.printStackTrace();     
}

注意:

  • 創建 SimpleDateFormat 對象時必須指定轉換格式。

  • 轉換格式區分大小寫,yyyy 代表年份,MM 代表月份,dd 代表日期,HH 代表 24 進制的小時,hh 代表 12 進制的小時,mm 代表分鐘,ss 代表秒。

3. 日期加減

通常來說,我們會對日期做兩種加減操作:

以某個日期爲基準,計算其幾天前/後、幾年前/後,或者其他時間單位前後的日期

//根據現在時間計算
Calendar now = Calendar.getInstance();
now.add(Calendar.YEAR, 1); //現在時間的1年後
now.add(Calendar.YEAR, -1); //現在時間的1年前
//根據某個特定的時間 date (Date 型) 計算
Calendar specialDate = Calendar.getInstance();
specialDate.setTime(date); //注意在此處將 specialDate 的值改爲特定日期
specialDate.add(Calendar.YEAR, 1); //特定時間的1年後
specialDate.add(Calendar.YEAR, -1); //特定時間的1年前

注意使用了 Calendar 對象的 add 方法,可以更改 Calendar.YEAR 爲任意時間單位字段,完成各種時間單位下的日期計算。

計算兩個時間的間隔,例如計算 2016 年 1 月 1 日距離現在有多少天。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2016-01-01 11:11:11";
Calendar calendar = Calendar.getInstance();
long nowDate = calendar.getTime().getTime(); //Date.getTime() 獲得毫秒型日期
try {
       long specialDate = sdf.parse(dateString).getTime();
       long betweenDate = (specialDate - nowDate) / (1000 * 60 * 60 * 24); //計算間隔多少天,則除以毫秒到天的轉換公式
        System.out.print(betweenDate);
} catch (ParseException e) {
         e.printStackTrace();
}

4. 日期比較

翻看自己以前的代碼,發現每當進行日期比較的操作時,總會先將日期轉爲 “yyyyMMdd” 格式的字符串,再將字符串轉爲數值,然後比較數值大小。哈哈,一個簡單的比較操作,卻要寫十幾行代碼,有點目不忍視。現在得說說正確地日期比較姿勢是怎麼樣的。

日期比較一般有兩種方法,對於 java.util.Date 或者 java.util.Calendar 都是通用的。一種是通過 after() 與 before() 方法進行比較,一種是通過 compareTo() 方法進行比較。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString_01 = "2016-01-01 11:11:11";
String dateString_02 = "2016-01-02 11:11:11";
try {
       Date date_01 = sdf.parse(dateString_01);
       Date date_02 = sdf.parse(dateString_02);
       System.out.println(date_01.before(date_02)); //true,當 date_01 小於 date_02 時,爲 true,否則爲 false
       System.out.println(date_02.after(date_01)); //true,當 date_02 大於 date_01 時,爲 true,否則爲 false
       System.out.println(date_01.compareTo(date_02)); //-1,當 date_01 小於 date_02 時,爲 -1
       System.out.println(date_02.compareTo(date_01)); //1,當 date_02 大於 date_01 時,爲 1
       System.out.println(date_02.compareTo(date_02)); //0,當兩個日期相等時,爲 0
} catch (ParseException e) {
        e.printStackTrace();
}

發佈了28 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章