2017-07-06 98 views
1

我想將Europe/London時間的dateTime字符串轉換爲UTC。從歐洲/倫敦時間轉換爲UTC時的問題

谷歌搜索告訴我,UTC應該在Europe/London時間後面一小時,但是當我試圖編寫一個單元測試來驗證這個時間計算結果在相同的時代。我也嘗試從另一個時區(Asia/Kolkata),並正常工作。所以我很困惑,不確定我做錯了什麼。

下面是我使用的功能(與2017-01-15 13:00:00一個dateString兩者上述時區)

long getUTCTimeEpoch(final String dateString, @NonNull final String fromTimeZone) { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT); 
    formatter.setTimeZone(TimeZone.getTimeZone(fromTimeZone)); 
    try { 
     Date inputTime = formatter.parse(dateString); 
     Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(fromTimeZone)); 
     calendar.setTime(inputTime); 
     Calendar utcCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
     utcCalendar.setTimeInMillis(calendar.getTimeInMillis()); 
     return utcCalendar.getTime().getTime(); 
    } catch (ParseException e) { 
     return 0; 
    } 
} 

這工作,

assertThat(getUTCTimeEpoch(timeString, "Asia/Kolkata"), is(1484465400000)) 

和失敗,

assertThat(getUTCTimeEpoch(timeString, "Europe/London"), is(1484481600000)) 
+0

是否有可能使用更現代化的時間庫,比如三個十個abp? –

+0

這是我現在需要做的唯一的地方,所以最好不要,但即使我這樣做,我仍然想知道爲什麼上述不起作用 –

+1

您是否考慮了DST(存在於倫敦但不是utc )? –

回答

2

在倫敦2017-01-15 13:00:00也是UTC 2017-01-15 13:00:00,因爲在London is not in Daylight Saving Time (DST),和其本地時間是一樣的UTC。這就是爲什麼你得到毫秒值1484485200000

UTC在倫敦只有 DST,通常發生在3月和10月之間一個小時。例如,如果您在七月份使用日期,那麼會有一小時的差異。

毫米值1484481600000相當於2017-01-15 12:00:00(倫敦和UTC)。只需相應地更改這些值,測試就會通過。

+1

:facepalm:謝謝! –

0

在這種轉換中涉及到很多玩家,一對是:

  • 從2個不同的時區
  • 本地時區規則(BST,GMT與WET本地倍; CET/CEST;等等)

解決方案:使用java.time classes可以處理所有你需要的東西。

看着你,ZonedDateTime