java中的時間操作2 [轉]

java中的時間操作2 

文/Ray

三、設置時間

 

現實中的時間是由不得我們這些凡夫俗子的,如來老頭來了也許還有點可能,但在程序裏我們可以變得神通廣大。設置時間最典型的應用就是定時任務,我們設置一個時間,到時執行某項任務。

但這裏我們主要不是爲了解決這個定時任務的問題,我們是爲了搞清楚怎麼設置時間。關於定時任務,在後面再討論怎麼做。

所謂的設置時間,其實就是我們把一個我們能看懂的時間的顯性的值(數字、字符串等),轉化成程序能看得懂的(Date類,long型的毫秒值等)告訴它。

最直接的思路是,new一個Date類,使用它的某個方法,傳進我們指定的數字或字符串類型的值,設置它的時間。

那就先來看一下Date這個類,這個類裏面有好多方法,什麼setYearsetMonth的,看起來真是太好了,傳個int值進去就搞定了。

可惜,這些看起來非常good的方法從JDK1.1以後就不用了,只有一個

setTime(long time)方法還勉強可以用,但是看看這個方法的參數吧,TNND,是個long200671號的long值是什麼?鬼才知道。

所以這個方法不可取,剛纔也提到Date類裏有很多方法從JDK1.1以後就不用了,其中就有什麼setYear,setMonth這樣的方法。這些方法不是JDK裏面沒有了,而是被Calendar類裏面的方法給取代了。(爲什麼取代?這個問題去問開發JDK的那幫人好了)

 

其實,還是用上面說到的SimpleDateFormat就可以搞定,代碼,三行:

SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);

sdf.applyPattern("yyyyMMdd_HHmmss");

Date date = sdf.parse("20060701_140000");

 

一看就懂了吧,第一行是聲明對象的,如果前面已經聲明瞭,這一行也省了,第二行是設置模式(pattern)的,關於這個模式,前面已經解釋的很詳細了,沒有什麼好說的。第三行,就是要設置的時間跟模式對應的字符串。第三行就返回了我們要得到的Date類型。(囉嗦了這麼半天,才囉嗦出這麼三行代碼:)

 

Ok,這個問題搞定,繼續下一個。

 

四、時間的運算

 

現在我們要開始用Calendar了,簡單介紹一下先,JDK的文檔裏說,Calendar主要是用來對Date對象和Integer對象做轉換的(這樣看起來上面那個問題我們也可以使用Calendar)。事實上,實際的開發應用中,Calendar往往用來對時間進行操作,比如說設置個時間啊,對時間進行個對比運算什麼滴。

舉個例子,已知兩個Date型時間對象,date1date2,我們需要計算出這兩個時間之間相差幾個小時,怎麼做。

一種思路:得到這兩個時間對象的long值,然後相減,這就得到了他們相差的毫秒值,然後再根據這個毫秒值算出對應的小時。代碼如下:

int distance = (int)((date2.getTime() - date1.getTime())/1000/60/60);

簡單解釋一下:

date2.getTime() - date1.getTime()得到相應的long型時間值並相減,得到相差的毫秒值,再除1000,得到秒,再除60,得到分,再除60,得到小時。呵呵,我真是夠囉嗦!從毫秒轉化成秒的時候,我在google上搜索了半天才確定一秒等於1000毫秒,真是白癡:)

 

按上面的方式,似乎問題已經解決了。但是,結果得到的小時值很大可能是個小數,而且,有可能是個小數位很長的小數,這樣就要考慮精確位的問題,上面那行代碼就不夠用了;還有一個比較關鍵的問題是,根據我們的習慣,往往可能是希望知道他們相差幾小時幾分幾秒,而不是幾點幾個小時,也可能我們只想知道他們差幾個小時,至於小時之外還差幾分幾秒,我們不感興趣,這樣,上面那行代碼也不夠用了。

如果要解決這種方式帶來的後續的這兩個問題,還要寫更多的代碼,麻煩死了,我是個懶人,不想費那腦子,我需要找一種更直接,更簡單的方式來解決。

 

終於輪到Calendar出場了,對上面的問題,解決的代碼如下:

Calendar ca1 = Calendar.getInstance();

Calendar ca2 = Calendar.getInstance();

ca1.setTime(date1);

ca2.setTime(date2);

int distanceHour = ca2.get(Calendar.HOUR_OF_DAY) - ca1.get(Calendar.HOUR_OF_DAY);

 

雖然有五行代碼,但這五行代碼根本都不用費我的腦子考慮,不像前面的,還要考慮轉化什麼的,而且這五行代碼完全可以像前面一樣用一行代碼搞定。

這樣就得到了這兩個時間相差的小時的值,我可以保證絕對是個整數,因爲這個distanceHour只是這兩個時間對象的小時數之差,而不考慮它們的分秒的差,如果想得它們差幾分,代碼如下

int distanceMin = ca2.get(Calendar.MINUTE) - ca1.get(Calendar.MINUTE);

 

解釋一下上面的代碼:

Calendar ca1 = Calendar.getInstance();

得到一個Calendar對象,Calendar不提供公用的構造函數,不能new。這行代碼得到的新對象的時間設置爲當前時間。

ca1.setTime(date1);

Calendar對象的時間設置爲date1的時間。

ca1.get(Calendar.HOUR_OF_DAY)

獲取Calendar對象的小時值,這裏得到的是24小時制的。這個get方法參數是int型的,用來指定想要獲取的域(field),就是什麼年啊月啊周啊小時的東西。參數需要用Calendar類定義的常量,每個常量對應一個域(field),這些常量的含義都很明顯(都可以顧名思義出來),用的時候在IDE環境裏直接打點選擇就可以。

這個get方法用起來很靈活,比如得到一天的int值,我們可以得到這一天一個月裏的第幾天,也可以得到一週裏的第幾天,也可以得到一年裏的第幾天,只要傳進對應的參數就OK了。

有一點需要注意的是,按照我們的習慣,週一是一週的第一天,而老外的習慣是週日纔是第一天,他們是先做完禮拜纔開始這一週的。所以如果今天是週一,我們使用ca1.get(Calendar.DAY_OF_WEEK)時得到的值是2

 

 

前面提到,Canlendar也可以用來設置時間,代碼如下

Calendar ca = Calendar.getInstance();

ca.set(Calendar.YEAR, 2006);

ca.set(Calendar.MONTH, 7);

ca.set(Calendar.DAY_OF_MONTH, 1);

ca.set(Calendar.HOUR_OF_DAY, 14);

ca.set(Calendar.MINUTE,0);

ca.set(Calendar.SECOND, 0);

Date date = ca.getTime();

這跟前面第三個問題中的那三行代碼的結果基本上是一樣的,爲什麼說基本上?因爲毫秒值不一樣,ca的毫秒值是當前時間的毫秒值,而我們沒有進行設置,所以仍然是當前的毫秒值。用那三行代碼,還是用這幾行,任君選擇。

相關文章:java中的時間操作,第一部分 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章