2017-07-06 39 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