Java Date Time 教程-java.util.Calendar和GregorianCalendar
目錄
- 實例化
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日,那麼真實的日期是什麼呢?
最後更新:2017-05-22 13:32:13
上一篇:
圖解 & 深入淺出 JavaWeb:Servlet 再說幾句
下一篇:
《 Java並發編程從入門到精通》 Java線程池的監控
新研究旨在解決黑箱算法中AI產生的偏見問題
關於android的animation的xml定義中的android:interpolator屬性的含義
Jquery獲取radio,checkbox,select的值
思科與華為十年戰爭:優勢正失 前景蒙陰影
《數據結構與抽象:Java語言描述(原書第4版)》一1.1 什麼是包
坐擁“Surface” X86平板裝Win 8係統教程
使用BenchmarkSQL 測試Oracle 12c TPC-C 性能
【方法1】刪除Map中Value重複的記錄,並且隻保留Key最小的那條記錄
程序員追求的是什麼?
1個月千餘人參加!阿裏雲大學互聯網技能“輕”認證受熱捧