2012-09-19 348 views
17

我有一個UTC時間戳,我想將它轉換爲當地時間,而不使用像TimeZone.getTimeZone("PST")這樣的API調用。你應該如何做到這一點?我一直在使用下面的代碼沒有成功:Java:如何將UTC時間戳轉換爲本地時間?

private static final SimpleDateFormat mSegmentStartTimeFormatter = new  SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 

Calendar calendar = Calendar.getInstance(); 

    try { 
     calendar.setTime(mSegmentStartTimeFormatter.parse(startTime)); 
    } 
    catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    return calendar.getTimeInMillis(); 

樣品的輸入值:[2012-08-15T22:56:02.038Z]

應返回[2012-08-15T15:56:02.038Z]

回答

38

Date等值UTC沒有時區和內部商店。只有格式化日期時才適用時區更正。當使用DateFormat時,它默認爲它所運行的JVM的時區。使用setTimeZone根據需要進行更改。

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

Date date = utcFormat.parse("2012-08-15T22:56:02.038Z"); 

DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 
pstFormat.setTimeZone(TimeZone.getTimeZone("PST")); 

System.out.println(pstFormat.format(date)); 

這將打印2012-08-15T15:56:02.038

注意,我在PST格式留出了'Z',因爲它表明UTC。如果你只是用Z去那麼輸出將2012-08-15T15:56:02.038-0700

+5

很酷它實際上工作。我可以通過調用TimeZone.getDefault()來獲取Android設備的默認時區。 –

0

下面是一個簡單修改的​​方案

public String convertToCurrentTimeZone(String Date) { 
      String converted_date = ""; 
      try { 

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

       Date date = utcFormat.parse(Date); 

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

       converted_date = currentTFormat.format(date); 
      }catch (Exception e){ e.printStackTrace();} 

      return converted_date; 
    } 


    //get the current time zone 

    public String getCurrentTimeZone(){ 
      TimeZone tz = Calendar.getInstance().getTimeZone(); 
      System.out.println(tz.getDisplayName()); 
      return tz.getID(); 
    } 
+0

這會返回UTC時間,我想將其轉換爲當地時間! – ArhatBaid

2

使用現代的Java日期&時間API,這是簡單的:

String inputValue = "2012-08-15T22:56:02.038Z"; 
    Instant timestamp = Instant.parse(inputValue); 
    ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("America/Los_Angeles")); 
    System.out.println(losAngelesTime); 

This print

2012-08-15T15:56:02.038-07:00[America/Los_Angeles] 

注意要點:

  • 有一個在你的期望一個小錯誤。您的時間戳中的Z表示UTC,也稱爲祖魯時間。所以在你當地的時間價值中,Z不應該在那裏。相反,你會想要一個返回值,例如2012-08-15T15:56:02.038-07:00,因爲偏移量現在是-7小時而不是Z.
  • 避免三個字母的時區縮寫。它們不是標準化的,因此通常是不明確的。例如,太平洋標準時間可能意味着菲爾平標準時間,太平洋標準時間或皮特凱恩標準時間(儘管S中的縮寫通常表示夏令時(意爲DST))。如果您打算使用太平洋標準時間,那甚至不是時區,因爲在夏季(您的樣本時間戳落在此處)將使用太平洋夏令時。與我的代碼一樣,使用地區/城市格式的時區ID代替縮寫。
  • 時間戳通常最好作爲Instant對象處理。只有在需要時才轉換爲ZonedDateTime,例如演示文稿。

問題:我可以使用現代API與我的Java版本嗎?

如果至少使用Java ,您可以。