2010-04-23 53 views
3

我有一個分貝,它以格林尼治標準時間格式存儲OleDateTime格式的日期。我已經實現了一個類,在java中擴展Date以表示經典日期格式。但我的課程是依賴於地區的(我在GMT + 2)。因此,它將db中的日期轉換爲date - 2 hours。我如何使它正確地轉換日期?我希望我的課程能夠獨立於語言環境,並始終使用GMT時區。其實,問題是:如何使日期區域獨立?

class MyOleDateTime extends Date { 

    static { 
     Locale.setDefault(WhatGoesHere?) 
    } 

    // ... some constructors 
    // ... some methods 
} 

回答

7

嗯,這是更好地使用日曆對象一樣建議在其他的答案。但是,如果您想要設置全球時區真的,則可以在應用程序代碼的早期使用TimeZone.setDefault(TimeZone.getTimeZone("UTC"));。還有user.timezone Java系統屬性。

另外(只是有趣的知道),它似乎是唯一的實際居住GMT/UTC時間(沒有夏時制的變化)的國家是利比里亞。

事實上,Date對象本身是總是 locale-和時區無關。它的getTime()方法將始終返回自1970年1月1日00:00:00(不包括閏秒)以來的UTC毫秒數。但是如果你想得到的東西不是毫秒,你必須使用Calendar,其中與時區相關的。但這是正確的路要走。你不會在Date課中使用過時的方法,是嗎?

+0

是的,這就是我一直在尋找的,非常感謝。 – folone 2010-04-23 10:05:45

+1

*嘆*他在那裏,愉快地做錯事... – 2010-04-23 10:07:35

+0

@邁克爾但我真的沒有訪問客戶端代碼,使用我的課程。它*不會*使用已棄用的日期api。那我該怎麼辦? – folone 2010-04-23 10:10:53

0

使用Calendar對象:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"), 
            locale); 
+0

我的課堂在很多地方都用作日期,我無法改變。 – folone 2010-04-23 09:53:21

2

A 日期語言環境無關,總是使用GMT時區。它僅僅是GMT格式的一個毫秒時間戳的包裝器(更正確的說:UTC)。

與時區相關的Date中唯一的東西是不推薦使用的方法,如getDay() - 這就是爲什麼它們不推薦使用。那些使用默認時區。正確的做法是避免使用已棄用的方法 - 而不是將默認時區設置爲UTC!這可能會導致其他地方的問題,並且您無法阻止代碼的其他部分將默認時區設置爲其他部分。

6

正如Michael Borgwardt所說的,Java Date對象不知道任何關於時區的信息。從01-01-1970 00:00:00 UTC開始,它僅僅是幾毫秒的包裝。

只有當您例如使用DateFormatDate對象轉換爲String時,纔開始處理時區。您在DateFormat上設置時區以指定您想在哪個時區看到Date

DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss Z"); 
df.setTimeZone(TimeZone.getTimeZone("UTC")); 

String text = df.format(date); // text will contain date represented in UTC 
0

這是我用來計算GMT從Calendar實例偏移和格式化一個片段。我很欣賞我從這個網站獲得的所有幫助,它很高興爲您做出貢獻。我希望這可以幫助別人。請享用。

Calendar calInst = Calendar.getInstance(); 

//calculate the offset to keep calendar instance GMT 
int gmtOffsetMilli = calInst.get(Calendar.ZONE_OFFSET); 
long gmtOffsetHr = TimeUnit.HOURS.convert(gmtOffsetMilli, TimeUnit.MILLISECONDS); 

calInst = Calendar.getInstance(TimeZone.getTimeZone("GMT " + gmtOffsetHr));