2012-11-04 53 views
0

我試圖顯示每個時區的當前時間,如下所示,但不會按預期打印出時間。每個時區的顯示時間

long currentLong = System.currentTimeMillis(); 
TimeZone.setDefault(TimeZone.getTimeZone("EST")); 
System.out.println("EST=="+ new java.util.Date(currentLong).toString()); 

TimeZone.setDefault(TimeZone.getTimeZone("CST")); 
System.out.println("CST=="+ new java.util.Date(currentLong).toString()); 

TimeZone.setDefault(TimeZone.getTimeZone("MST")); 
System.out.println("MST=="+ new java.util.Date(currentLong).toString()); 

TimeZone.setDefault(TimeZone.getTimeZone("PST")); 
System.out.println("PST=="+ new java.util.Date(currentLong).toString()); 

TimeZone.setDefault(TimeZone.getTimeZone("AST")); 
System.out.println("AKST=="+ new java.util.Date(currentLong).toString()); 

TimeZone.setDefault(TimeZone.getTimeZone("HST")); 
System.out.println("HAST=="+ new java.util.Date(currentLong).toString()); 

當我執行該程序,我得到這樣的:

EST==Sat Nov 03 22:24:02 EST 2012 
CST==Sat Nov 03 22:24:02 CDT 2012 
MST==Sat Nov 03 20:24:02 MST 2012 
PST==Sat Nov 03 20:24:02 PDT 2012 
AKST==Sat Nov 03 19:24:02 AKDT 2012 
HAST==Sat Nov 03 17:24:02 HST 2012 

我想知道爲什麼CST的時間是一樣的EST和MST和PST相同。

有人能告訴我問題是什麼嗎?

謝謝。

回答

2

請勿使用TimeZone.setDefault(),請使用Calendar.getInstance(TimeZone tz)Calendar.setTimeZone()Date很漂亮,Calendar好多了。

+0

對於像這樣的基本員工,Date實際上更好。日曆的API非常難看。最好的解決方案是使用[Joda-Time](http://joda-time.sourceforge.net/)並完全擺脫JDK的恐怖API。 –

0

問題是,您使用的是錯誤的類。當然,你不應該設置默認時區。

首先,默認時區是底層操作系統的時區。可以在桌面應用程序中使用它,但它不會爲Web應用程序提供有效的時間。在Web應用程序中,最好詢問用戶什麼是他/她的首選時區。

現在,如果你想轉換時區,它實際上很簡單,但你必須使用正確的類。正確的類是DateFormat

Date now = new Date(); 
// you need to detect locale somehow 
// this way is valid with desktop applications only 
Locale locale = Locale.getDefault(Locale.Category.FORMAT); 
DateFormat df = DateFormat.getDateTimeInstance(
    DateFormat.DEFAULT, DateFormat.DEFAULT, locale); 
TimeZone est = TimeZone.getTimeZone("EST"); 
TimeZone mst = TimeZone.getTimeZone("MST"); 

df.setTimeZone(est); 
System.out.println(df.format(now)); 
df.setTimeZone(mst); 
System.out.println(df.format(now)); 

至於與否,時間區是相同的,你可以讓他們平等:

System.out.println(est.equals(mst)); 

這是可能的,這些時間段會不同,但目前的抵消將是相同的。您可以查詢偏移量是多少:like this

int estOffset = est.getOffset(now);