5 Jan 2018

Java Calendar and Date 的基本使用

一、前言

在 Java 開發中,日期處理是非常複雜的一塊,時間處理要考慮時間的度量以及年曆的種類。本篇文章將介紹 java.util.Date、java.text.DateFormat、和 java.util.Calendar 的基本概念以及使用。

二、Date

java.util.Date 的時間是 epoch 毫秒數,也就是 1970 年1月1日 00:00:00 UTC 後經過的毫秒數。此類別封裝的時間數字不具閱讀意義,如下程式碼及其執行結果。

Date 基本使用程式碼:

Date date = new Date();
System.out.print(date.getTime());

執行結果:

1515073083674

Date 的無引數建構子是以 System.currentTimeMillis() 取得現在時間的 epoch 毫秒數。而這一長串的數字對人類而言不可閱讀,若要轉換成我們看得懂時間則需要 DateFormat 的幫忙。

三、DateFormat

java.text.DateFormat 是一個用來處理字串時間格式與 Date 格式轉換的類別。常用的類別為 SimpleDateFormat,使用者可以任意的規定其時間顯示的格式,SimpleDateFormat 會將 Date 轉為現在所在時區的時間。

利用 SimpleDateFormat 將 Date 轉乘累牘得懂的時間的程式碼:

Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sdate= dateFormat.format(date);
System.out.print(sdate)

執行結果:

2018-01-04 22:11:11

若要將文字格式轉成 Date 則需用到 parse() 方法

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    Date date = dateFormat.parse("2018-01-04 22:11:11");    
    System.out.print(date.getTime()+"");
} catch (ParseException e) {
    e.printStackTrace();
}

執行結果:

1515075071000

四、Calendar

java.util.Calendar 的應用多在時間的加減以及比較。

取得現在時間

Calendar now = Calendar.getInstance();
System.out.print(now.get(Calendar.YEAR)+"-"
    +now.get(Calendar.MONTH)+"-"
    +now.get(Calendar.DAY_OF_MONTH)+" "
    +now.get(Calendar.HOUR)+":"
    +now.get(Calendar.MINUTE)+":"
    +now.get(Calendar.SECOND)
); 

執行結果

2018-0-4 10:50:49

比照執行結果與電腦上的時會發現月份應該是1才對,這是因為 Calendar 對月份的列舉從零開始。

對時間做加減

Calendar calendar = Calendar.getInstance();
calendor.add(Calendar.YEAR,1)//對時間加1年
calendor.add(Calendar.MONTH,-2)//對時間減去2個月
calendor.add(Calendar.DATE,3)//對時間加3天

比較時間前後則可用 after()before() 方法。

Date 與 Calendar

Calendar alarm = Calendar.getInstance();
String time = "07:00"
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
try {
    Date date = simpleDateFormat.parse(time);
    alarm.setTime(date);
    alarm.set(Calendar.YEAR,now.get(Calendar.YEAR));
    alarm.set(Calendar.MONTH,now.get(Calendar.MONTH));
    alarm.set(Calendar.DAY_OF_MONTH,now.get(Calendar.DAY_OF_MONTH));
    System.out.print(alarm.get(Calendar.YEAR)+"-"
            +alarm.get(Calendar.MONTH)+"-"
            +alarm.get(Calendar.DAY_OF_MONTH)+" "
            +alarm.get(Calendar.HOUR)+":"
            +alarm.get(Calendar.MINUTE)+":"
            +alarm.get(Calendar.SECOND)    
    );
    alarm.setTime(date);
    System.out.print(alarm.get(Calendar.YEAR)+"-"
            +alarm.get(Calendar.MONTH)+"-"
            +alarm.get(Calendar.DAY_OF_MONTH)+" "
            +alarm.get(Calendar.HOUR)+":"
            +alarm.get(Calendar.MINUTE)+":"
            +alarm.get(Calendar.SECOND)
    );
} catch (ParseException e) {
    e.printStackTrace();
}

執行結果

2018-0-5 8:0:0
1970-0-1 8:0:0

Tags:
0 comments