1. 程式人生 > >Java Date Time 教程-java.util.Calendar和GregorianCalendar

Java Date Time 教程-java.util.Calendar和GregorianCalendar

原文連結 作者:Jakob Jenkov  譯者:魏嘉鵬

目錄

  • 例項化GregorianCalendar
  • 獲取年、月、日等
  • 增加和減少年、月、日等
  • 陷阱和誤區
  • 月份的陷阱
  • 星期幾的誤區
  • JavaDoc中的更多細節

Javajava.util.Calendar用於日期和時間的運算。無論任何時候,只要你有一些輕微操作(除了僅僅表示日期和時間)需要執行,那麼就使用這個類。(原文:Whenever you have something slightly more advanced than just representing a date and time, this is the class to use。)
java.util.Calendar

類是抽象的,意味著你不能對其進行例項化。這麼設計的原因是這個世界有著多個日曆存在。舉個例子,阿拉伯日曆使用了一個和大部分西方國家所使用的公曆不同的年份作為它的第一年。
譯者注
關於現行公曆,轉載維基的一段內容如下(地址在這):
現行公曆(拉丁語:Calendarium Gregorianum,又稱格里曆,又譯國瑞歷、額我略曆、格列高利曆、格里高利曆),是由義大利醫生兼哲學家阿洛伊修斯·裡利烏斯改革儒略曆制定的歷法,由教皇格列高利十三世在1582年頒行。公曆是陽曆的一種,於1912年開始在中國正式採用,取代傳統使用的中國曆法農曆,而中國傳統曆法是一種陰陽曆,因而公曆在中文中又稱陽曆、西曆、新曆。格里曆與儒略曆一樣,格里曆也是每四年在2月底置一閏日,但格里曆特別規定,除非能被400整除,所有的世紀年(能被100整除)都不設閏日;如此,每四百年,格里曆僅有97個閏年,比儒略曆減少3個閏年。)

例項化GregorianCalendar

Java中只攜帶了格里曆的實現,那就是java.util.GregorianCalendar類,下面是一個你如何例項化GregorianCalendar的例子:

Calendar calendar = new GregorianCalendar();

一個新的GregorianCalendar有著被設定為當前時間點的日期和時間,表示這是由它所建立的。

獲取年、月、日等

Calendar類有著一些成對的方法可以讓你獲取到年、月、日、小時、分鐘、秒、毫秒和給定日期的時區。下面是一些如何獲取的例子:

Calendar calendar = new GregorianCalendar();

int year       = calendar.get(Calendar.YEAR);
int month      = calendar.get(Calendar.MONTH); 
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // Jan = 0, not 1
int dayOfWeek  = calendar.get(Calendar.DAY_OF_WEEK);
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH);

int hour       = calendar.get(Calendar.HOUR);        // 12 hour clock
int hourOfDay  = calendar.get(Calendar.HOUR_OF_DAY); // 24 hour clock
int minute     = calendar.get(Calendar.MINUTE);
int second     = calendar.get(Calendar.SECOND);
int millisecond= calendar.get(Calendar.MILLISECOND);

你還可以訪問更多的欄位,比如不常用的DAY_OF_WEEK_IN_MONTHAM_PM。你可以查閱官方的JavaDoc瞭解這些欄位的更多資訊。
Calendar類有著對應的set方法,因此你也可以對這些欄位進行設定。下面是它長啥樣的例子:

Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2009);
calendar.set(Calendar.MONTH, 11); // 11 = december
calendar.set(Calendar.DAY_OF_MONTH, 24); // christmas eve

新增和減少年、月、日等

你也可以在這些欄位上新增值並使得Calendar例項準確地自行更新。看看下面的例子:

Calendar calendar = new GregorianCalendar();

//set date to last day of 2009
calendar.set(Calendar.YEAR, 2009);
calendar.set(Calendar.MONTH, 11); // 11 = december
calendar.set(Calendar.DAY_OF_MONTH, 31); // new years eve

//add one day
calendar.add(Calendar.DAY_OF_MONTH, 1);

//date is now jan. 1st 2010
int year       = calendar.get(Calendar.YEAR);  // now 2010
int month      = calendar.get(Calendar.MONTH); // now 0 (Jan = 0)
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // now 1

當進行一些日期運算的時候,add方法是非常便利的。比如在一個給定的日期上新增或者減少年數、月數、天數、小時數等。
通過呼叫帶有負值的add方法在這些欄位上減少值,比如:

calendar.add(Calendar.DAY_OF_MONTH, -1);

陷阱和誤區

Calendar類中有一些小陷阱,你應該知道這些陷阱從而避免不必要的傷腦經。我將會在接下來的章節討論他們。

月份陷阱

Calendar類的MONTH欄位並不像我們在其他地方寫下日期般從1到12。取而代之的是月份從0走到11,0是1月,11是12月份。如果你不知道這個的話,它將會引發一點錯誤和隨其而來的除錯。

星期幾誤區

如你希望的那樣,星期是從1走到7,但是每週的第一天是週六而不是週一。這意味著1 = sunday, 2 = monday, …, 7 = Saturday。這也時不時地讓我感到有點煩惱。

JavaDoc中的更多細節

如果你需要做一些日期和時間的複雜運算,那麼查閱官方Javadocjava.util.Calendar文件是個不錯的主意。類文件包含了更多關於該類的特性。舉個例子假如你設定日期為2009年1月34日,那麼真實的日期是什麼呢?

(全文完)