日歷代碼解析_第1頁
日歷代碼解析_第2頁
日歷代碼解析_第3頁
日歷代碼解析_第4頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、JAVA Calendar 詳解 收藏(在文章的最后,將會(huì)介紹Date 類,若是有愛好,能夠直接翻到最后去閱讀)究竟什么是一個(gè) Calendar 呢?中文的翻譯確實(shí)是日歷,那咱們立刻能夠想到咱們生活中有陽( 公)歷、陰 (農(nóng) )歷之分。它們的區(qū)別在哪呢?比如有:月份的概念- 陽 ( 公)歷 一年12 個(gè)月,每一個(gè)月的天數(shù)各不同;陰(農(nóng)) 歷,每一個(gè)月固定28 天每周的第一天- 陽 (公 )歷禮拜日是第一天;陰(農(nóng) )歷,禮拜一是第一天事實(shí)上, 在歷史上有著許多種紀(jì)元的方式。它們的不同實(shí)在太大了,比如說一個(gè)人的生日是" 八月八日 " 那么一種可能是陽 (公 )歷的八月八日,但

2、也能夠是陰 (農(nóng) )歷的日期。因此為了計(jì)時(shí)的統(tǒng)一,必需指定一個(gè)日歷的選擇。那此刻最為普及和通用的日歷確實(shí)是"GregorianCalendar" 。也確實(shí)是咱們?cè)谥v述年份時(shí)經(jīng)常使用" 公元幾幾年 " 。 Calendar 抽象類概念了足夠的方式, 讓咱們能夠表述日歷的規(guī)那么。Java 本身提供了對(duì)"Gregorian Calendar"規(guī)那么的實(shí)現(xiàn)。咱們從() 中所取得的實(shí)例確實(shí)是一個(gè)"GreogrianCalendar"對(duì)象 (與您通過newGregorianCalendar()取得的結(jié)果一致)。下面的代碼能夠證

3、明這一點(diǎn):import .*;import .*;public class WhatIsCalendarpublic static void main(String args) Calendar calendar = ();if (calendar instanceof GregorianCalendar)"It is an instance of GregorianCalendar"t;Calendar 在 Java 中是一個(gè)抽象類(Abstract Class) ,GregorianCalendar是它的一個(gè)具體實(shí)現(xiàn)。咱們也能夠自己的Calendar 實(shí)現(xiàn)類,然后將它作

4、為Calendar 對(duì)象返回 (面向?qū)ο蟮奶匦?。在 IBMalphaWorks 上, IBM的開發(fā)人員實(shí)現(xiàn)了多種日歷。一樣在Internet 上,也有對(duì)中國農(nóng)歷的實(shí)現(xiàn)。 本文對(duì)如何擴(kuò)展 Calendar 不作討論, 大伙兒能夠通過觀察上述 Calendar 的源碼來學(xué)習(xí)。Calendar 與 Date 的轉(zhuǎn)換超級(jí)簡(jiǎn)單:Calendar calendar = ();Calendar 的 set() 方式set(int field, int value) -是用來設(shè)置 "年 /月 /日 /小時(shí) /分鐘 /秒 /微秒 " 等值field的概念在Calendar 中set(int

5、 year, int month, int day, int hour, int minute, int second)但沒有set(int year, int month, int day, int hour, int minute, int second, int millisecond) 前 面 set(int,int,int,int,int,int) 方式可不能自動(dòng)將 MilliSecond 清為 0。另外,月份的起始值為而不是,因此要設(shè)置八月時(shí),咱們用而不是8。, 7);咱們通常需要在程序邏輯中將它清為0,不然可能會(huì)顯現(xiàn)下面的情形:import .*;import .*;public

6、 class WhatIsCalendarWritepublic static void main(String args) throws ExceptionObjectOutputStream out =new ObjectOutputStream(new FileOutputStream(""t);Calendar cal1 = ();(2000, 7, 1, 0, 0, 0);(cal1);Calendar cal2 = ();(2000, 7, 1, 0, 0, 0);, 0);(cal2);();咱們將Calendar 保留到文件中import .*;import

7、 .*;public class WhatIsCalendarReadpublic static void main(String args) throws ExceptionObjectInputStream in =new ObjectInputStream(new FileInputStream(""t);Calendar cal2 = (Calendar)();Calendar cal1 = ();(2000, 7, 1, 0, 0, 0);if (cal2)"Equals"t;else"NotEqual"t;"Ol

8、d calendar "+().getTime();"New calendar "+().getTime();, 0);cal2 = (Calendar)();if (cal2)"Equals"t;else"NotEqual"t;"Processed Old calendar "+().getTime();"Processed New calendar "+().getTime();然后再另外一個(gè)程序中取回來(模擬對(duì)數(shù)據(jù)庫的存儲(chǔ)),可是執(zhí)行的結(jié)果是:NotEqualOld calend

9、ar 0422 <-最后三位的MilliSecond 與當(dāng)前時(shí)刻有關(guān)New calendar 0059 <-/EqualsProcessed Old calendar 0000Processed New calendar 0000另外咱們要注意的一點(diǎn)是,Calendar 為了性能緣故對(duì)set() 方式采取延緩計(jì)算的方式。在JavaDoc 中有下面的例子來講明那個(gè)問題:Calendar cal1 = ();(2000, 7, 31, 0, 0 , 0); Calendar對(duì)象的容錯(cuò)性,Lenient 設(shè)置咱們明白特定的月份有不同的日期,當(dāng)一個(gè)用戶給犯錯(cuò)誤的日期時(shí),Calendar 如

10、何處置的呢?import .*;import .*;public class WhatIsCalendarpublic static void main(String args) throws ExceptionCalendar cal1 = ();(2000, 1, 32, 0, 0, 0);1, 32, 0, 0, 0);它的執(zhí)行結(jié)果是:Tue Feb 01 00:00:00 PST 2000Exception in thread "main":12)當(dāng)咱們?cè)O(shè)置該Calendar 為 Lenient false時(shí),它會(huì)依據(jù)特定的月份檢查犯錯(cuò)誤的賦值。3. 不穩(wěn)固的Cal

11、endar咱們明白Calendar 是能夠被serialize 的,可是咱們要注意下面的問題import .*;import .*;public class UnstableCalendar implements Serializablepublic static void main(String args) throws ExceptionCalendar cal1 = ();(2000, 7, 1, 0, 0 , 0);, 0);ObjectOutputStream out =new ObjectOutputStream(new FileOutputStream(""t

12、);(cal1);();ObjectInputStream in =new ObjectInputStream(new FileInputStream(""t);Calendar cal2 = (Calendar)();, 0);運(yùn)行的結(jié)果竟然是: Thu Jan 01 00:00:00 PST 1970它被恢復(fù)到EPOC 的起始點(diǎn),咱們稱該Calendar 是處于不穩(wěn)固狀態(tài)。那個(gè)問題的全然緣故是Java 在serialize GregorianCalendar 時(shí)沒有保留所有的信息,因此當(dāng)它被恢復(fù)到內(nèi)存中,又缺少足夠的信息時(shí),Calendar 會(huì)被恢復(fù)到EPOCH 的起始

13、值。 Calendar 對(duì)象由兩部份組成:字段和相關(guān)于EPOC 的微秒時(shí)刻差。字段信息是由微秒時(shí)刻差計(jì)算出的,而set()方式可不能強(qiáng)制Calendar 從頭計(jì)算字段。如此字段值就不對(duì)了。下面的代碼能夠解決那個(gè)問題:import .*;import .*;public class StableCalendar implements Serializablepublic static void main(String args) throws ExceptionCalendar cal1 = ();(2000, 7, 1, 0, 0 , 0);, 0);ObjectOutputStream ou

14、t =new ObjectOutputStream(new FileOutputStream(""t);(cal1);();ObjectInputStream in =new ObjectInputStream(new FileInputStream(""t);Calendar cal2 = (Calendar)(); add() 與 roll()的區(qū)別add() 的功能超級(jí)壯大,add 能夠?qū)alendar 的字段進(jìn)行計(jì)算。若是需要減去值,那么利用負(fù)數(shù)值就能夠夠了,如add(field, -value) 。add() 有兩條規(guī)那么:當(dāng)被修改的字段超出

15、它能夠的范圍時(shí),那么比它大的字段會(huì)自動(dòng)修正。如:Calendar cal1 = ();(2000, 7, 31, 0, 0 , 0);那個(gè)時(shí)刻通常被稱為Java 虛擬機(jī) (JVM) 主機(jī)環(huán)境的系統(tǒng)時(shí)刻.importpublic class DateExample1 public static void main(String args) 在那個(gè)例子中 ,值得注意的是咱們利用了Date 構(gòu)造函數(shù)創(chuàng)建一個(gè)日期對(duì)象, 那個(gè)構(gòu)造函數(shù)沒有同意任何參數(shù). 而那個(gè)構(gòu)造函數(shù)在內(nèi)部Date();那么輸出形式為:Tue Nov 08 14:28:07 CST 2005那么 , 此刻咱們已經(jīng)明白了如何獲取從1970

16、 年 1 月 1 日開始經(jīng)歷的毫秒數(shù)了. 咱們?nèi)绾尾拍芤砸环N用戶明白的格式來顯示那個(gè)日期呢? 在那個(gè)地址類.SimpleDateFormat和它的抽象基類就派得上用處了.二、日期數(shù)據(jù)的定制格式假設(shè)咱們希望定制日期數(shù)據(jù)的格式 , 例如禮拜六 -9 月-29 日 -2001 年 . 下面的例子展示了如何完成那個(gè)工作 :importpublic class DateExample2 public static void main(String args) SimpleDateFormat bartDateFormat =new SimpleDateFormat("EEEE-MMMM-dd-

17、yyyy");Date date = new Date();只要通過向 SimpleDateFormat 的構(gòu)造函數(shù)傳遞格式字符串 "EEE-MMMM-dd-yyyy", 咱們就能夠夠指明自己想要的格式 . 你應(yīng)該能夠看見 , 格式字符串中的 ASCII 字符告知格式化函數(shù)下面顯示日期數(shù)據(jù)的哪個(gè)部份. EEEE 是禮拜 , MMMM是月 , dd 是日, yyyy 是年 . 字符的個(gè)數(shù)決定了日期是如何格式化的.傳遞 "EE-MM-dd-yy"會(huì)顯示Sat-09-29-01. 請(qǐng)觀察 Sun 公司的 Web 站點(diǎn)獲取日期格式化選項(xiàng)的完整的指示.三

18、、將文本數(shù)據(jù)解析成日期對(duì)象r假設(shè)咱們有一個(gè)文本字符串包括了一個(gè)格式化了的日期對(duì)象, 而咱們希望解析那個(gè)字符串并從文今日期數(shù)據(jù)創(chuàng)建一個(gè)日期對(duì)象. 咱們將再次以格式化字符串"MM-dd-yyyy" 挪用 SimpleDateFormat 類 , 可是這一次 , 咱們利用格式化解析而不是生成一個(gè)文今日期數(shù)據(jù) . 咱們的例子 , 顯示在下面 , 將解析文本字符串 "9-29-2001" 并創(chuàng)建一個(gè)值為 0000 的日期對(duì)象 .例子程序 :importpublic class DateExample3 public static void main(String args) SimpleDateFormat bartDateFormat =new SimpleDateFormat("MM-dd-yyyy");String dateStringToParse = "9-29-2001"try Date date = (dateStringToParse);(Exception ex) 五、利用標(biāo)準(zhǔn)的日期格式化進(jìn)程既然咱們已經(jīng)能夠生成和解析定制的日期格式了 , 讓咱們來看一看如何利用內(nèi)建的格式化進(jìn)程 . 方式 () 讓咱們得以用幾種不同的方式取得標(biāo)準(zhǔn)的日期格式化進(jìn)程 . 在下面的例子中 , 咱

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論