2014-01-14 168 views
0

我想格式化日曆對象以特定格式返回時間。 但是,SimpleDateFormatter忽略了日曆對象的TimeZone和它自己的TimeZone屬性並進行不必要的時間轉換。我的電腦在EST,我正在通過「PST」中的Calendar obj。過去的時間是:1月14日星期二10:28:49,我期待返回值爲「上午10點28分49秒」。但是,返回的值是「07:28:49 AM PST」。爲什麼格式化程序obj設置爲PST時時區計算已完成?另外,如何防止從EST到PST的tz轉換?SimpleDateFormatter似乎忽略TimeZone

下面是代碼:

public static String formatDateToString(Calendar cal) { 
     if (cal != null) { 
      TimeZone tz = cal.getTimeZone(); 
      String tzId = tz.getID();**//"PST"** 

      Date date = cal.getTime(); 
      String str = date.toString();**//"Tue Jan 14 10:28:49 EST 2014"** 
      final SimpleDateFormat sdFormatter = new SimpleDateFormat("hh:mm:ss a zzz"); 

      sdFormatter.setTimeZone(TimeZone.getTimeZone(tzId)); 
      String calStr = sdFormatter.format(cal.getTime());**//"07:28:49 AM PST"** 

      return calStr; 
     } 

     return null; 
    } 

回答

1

Calendar#getTime()作爲(甲骨文JDK7)

public final Date getTime() { 
    return new Date(getTimeInMillis()); 
} 

實現這樣不管TimeZoneCalendar的都有,Date對象將您何時使用系統的默認調用其toString()方法。

EST比PST早3個小時。


從您的代碼段的評論,

String tzId = tz.getID();**//"PST"** 
... 
String str = date.toString();**//"Tue Jan 14 10:28:49 EST 2014"** 
final SimpleDateFormat sdFormatter = new SimpleDateFormat("hh:mm:ss a zzz"); 

sdFormatter.setTimeZone(TimeZone.getTimeZone(tzId)); 
String calStr = sdFormatter.format(cal.getTime());**//"07:28:49 AM PST"** 

一切似乎都沒事。您正在將表示爲Tue Jan 14 10:28:49 EST 2014的時間格式化爲值。時間本身是完全一樣的。表示是不同的。

如果您不想將其顯示爲PST,請撥打setTimeZone()呼叫。

+0

我想知道的是如何防止從EST到PST的tz轉換? – Neeraj

+0

@Neeraj查看我的評論。也許我誤解了你的擔憂。 –

0

這似乎是應該的方式。如果date.toString();"Tue Jan 14 10:28:49 EST 2014",那麼date代表的時間確實是PST中的7:28:49,或者是EST中的10:28:49。變量代表特定的時刻,而不是小時,分鐘,秒和時區的特定組值。

當您在SimpleDateFormatter中設置時區時,您的意思是,「當我們格式化此日期時,顯示PST中的小時,分​​鍾和秒,對應於日期代表的任何時刻。所以,不要認爲這是將時間從EST轉換爲PST--將其視爲輸出特定時間的小時,分​​鍾和秒,但是按照特定的時區進行。

1

你最好的選擇來改變時區不改變日期數字會joda time LIB DateTime類的withZoneRetainFields()

Calendar cal = GregorianCalendar.getInstance(); 
DateTime dt = new DateTime(cal); 
DateTime dtz = dt.withZoneRetainFields(DateTimeZone.forID("US/Pacific")); 

System.out.println(dt.toString());  
System.out.println(dtz.toString()); 

雖然日曆類將在美國東部時間你目前的情況下,你會得到相同的時間數字轉換爲PST(不進行自我計算)。

輸出:

2014-01-15T12:00:51.324+05:30 
2014-01-15T12:00:51.324-08:00 

更多細節here