2016-07-25 136 views
2

我正在做簡單的字符串日期轉換在Java中,只有一件事我不得不小心轉換應在格林威治標準時間。 我能夠在GMT格式轉換我的字符串。但是,當我試圖將該日期轉換爲時間戳時,我得到了不同的值(似乎值取決於我的本地時區)。Java日期時間戳轉換問題

public static void timeFun(String str) throws ParseException { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    String dateInString = "2015-07-10T09:54:31.000-04:00"; 
    Date date = formatter.parse(dateInString); 

    SimpleDateFormat sdfAmerica = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    TimeZone tz = TimeZone.getTimeZone("GMT"); 
    sdfAmerica.setTimeZone(tz); 

    String convertedDate = sdfAmerica.format(date); // Convert to String 
                // first 
    Date dateInGMT = sdfAmerica.parse(convertedDate); 
    System.out.println(convertedDate); // Output = 2015-07-10T13:54:31.000Z (Right) 
    Timestamp timestamp = new java.sql.Timestamp(dateInGMT.getTime()); 

    System.out.println(timestamp); // Output = 2015-07-10 19:24:31.0 (Wrong) 

} 
+0

日期和時間戳類沒有時區 - 他們只表示,因爲時代的一些米利斯的。他們的toString方法可能會根據您的機器設置進行一些轉換,但不會影響對象的內部狀態。如果您使用Timestamp,則可能需要與數據庫進行交互,並且結果應該如您所期望的那樣(13:54GMT或某個等效時間),如果您的數據庫列有時區。 – assylias

回答

0

此代碼爲我工作的罰款:

public static Timestamp convertStringToTimestamp(String strRaw) throws ParseException 
    { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    String dateInString = strRaw; 
    Date date = formatter.parse(dateInString); 
    TimeZone gmtTime = TimeZone.getTimeZone("GMT"); 
    formatter.setTimeZone(gmtTime); 
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
    calendar.setTime(date); 
    SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 

    Timestamp t = new Timestamp(formatter1.parse(formatter.format(calendar.getTime())).getTime()); 

    System.out.println("********"+new Date(t.getTime())); 
    return new Timestamp(formatter1.parse(formatter.format(calendar.getTime())).getTime()); 

    } 
2

亞歷山大的答案是正確的。

java.time

這些舊的日期 - 時間類是一個糟糕的混亂。避免它們,如其JavaDoc中所建議的那樣。它們已被java.time框架所取代。

OffsetDateTime odt = OffsetDateTime.parse("2015-07-10T09:54:31.000-04:00"); 

要得到UTC(格林威治標準時間),提取一個Instant

Instant instant = odt.toInstant(); 

看到相同的時刻通過特定時間段的鏡頭,應用ZoneId

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(zoneId); 

所有這些在Stack Overflow上已經被覆蓋了很多次。