Java Date Time 教程-java.util.Calendar和GregorianCalendar
原文連結 作者:Jakob Jenkov 譯者:魏嘉鵬
目錄
- 例項化
GregorianCalendar
- 獲取年、月、日等
- 增加和減少年、月、日等
- 陷阱和誤區
- 月份的陷阱
- 星期幾的誤區
JavaDoc
中的更多細節
Java
的java.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_MONTH
和AM_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中的更多細節
如果你需要做一些日期和時間的複雜運算,那麼查閱官方Javadoc
的java.util.Calendar
文件是個不錯的主意。類文件包含了更多關於該類的特性。舉個例子假如你設定日期為2009年1月34日,那麼真實的日期是什麼呢?
(全文完)