2013-05-18 47 views
1

我總是優先使用日曆上的日期類作爲其強大的日期操作(我也讀過某處日期類主要存在becoz的向後兼容可能在jdk 1.1之前)。但我認爲今天我有一個更多的理由去日曆即日曆處理本地化,這意味着,當我做java日期是否處理本地化(選擇Calendar日曆的原因之一)?

Calendar.getInstance()

將返回不同的地方代碼部署箱的時區和語言環境的日曆對象。但是當我做

新的Date()

將就該返回日期對象GMT

那是正確的(那感覺我要去通http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Date.html#Date()後得到了)?

回答

4

日期代表即時時間,並且不關心時區和區域設置。當你想爲人類解析或格式化一個日期(使用SimpleDateFormat)時,或者當你開始將日期與某些掛鐘值進行比較時,你只關心時區和區域設置,想知道日期是否在給定的月份,日期或小時,或添加日期並考慮日光節約(在這種情況下,您可以將日期轉換爲日曆)。

所以日期並不是天生就比日曆更有用的類。它只是沒有達到相同的目的。兩者都是互補的。

無論如何,我會推薦使用joda-time,這是一個更好的API,但仍具有相同的即時和劃分日期時間的概念。

+0

如您所說「日期代表即時時間,並且不關心時區和區域設置」。我的問題是,如果我在美國和德國的兩個不同的盒子上做新的Date(),它會返回相同的值。如果是,是否意味着該值將代表某個標準時間的即時時間,如GMT –

+0

是,日期代表UTC。 – flup

+0

如果你對Joda感興趣,看一下https://github.com/ThreeTen/threetenbp這是一個java 7新的日期API實現java 8 – flup

0

A Date對象從1970年1月1日起在內部存儲該日期爲一個毫秒數。但是當你訪問例如Date對象所代表的小時時,它會考慮時區信息。這可以使用這個簡單的代碼進行驗證:

import java.util.Date; 
public class Main { 

    public static void main(String[] args) { 
     Date date = new Date(1368868487441L); 

     System.out.println(date); 
    } 
} 

現在,如果你運行它設置時區(作爲JVM啓動參數)-Duser.timezone="Europe/Sofia"

Sat May 18 12:14:47 EEST 2013 

,但如果你將其更改爲-Duser.timezone="America/Arizona"的結果是不同的

Sat May 18 09:14:47 GMT 2013 

這是因爲Date實際使用Calendar實例內部以便利着想rt從 開始的milis自「時代」到實際時間值的數量。