閱讀830 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

目錄

  • 實例化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日,那麼真實的日期是什麼呢?

最後更新:2017-05-22 13:32:13

  上一篇:go  圖解 & 深入淺出 JavaWeb:Servlet 再說幾句
  下一篇:go  《 Java並發編程從入門到精通》 Java線程池的監控