【问题标题】:Issues when converting from Europe/London time to UTC从欧洲/伦敦时间转换为 UTC 时的问题
【发布时间】:2017-07-06 12:42:05
【问题描述】:

我正在尝试将 dateTime 字符串从 Europe/London 时间转换为 UTC。

谷歌搜索告诉我 UTC 应该比 Europe/London 时间晚一个小时,但是当我尝试编写单元测试来验证这一点时,时间计算结果在相同的纪元时间内。我还尝试了另一个时区(Asia/Kolkata),并且工作正常。所以我很困惑,不知道我做错了什么。

这是我正在使用的函数(日期字符串为 2017-01-15 13:00:00 和上述两个时区)

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))

【问题讨论】:

  • 是否可以使用更现代的时间库,比如三十 abp?
  • 这是我目前唯一需要这样做的地方,所以最好不要,但即使我这样做,我仍然想知道为什么上述方法不起作用
  • 您是否考虑了夏令时(伦敦存在,但 UTC 不存在)?
  • 你得到的不是1484485200000,而是什么价值?
  • 对不起,它是 1484485200000(我也在帖子中更新了正确的时间)

标签: java android timezone


【解决方案1】:

伦敦的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 月之间。例如,如果您使用 7 月的日期,则会有 1 小时的差异。

millis 值 1484481600000 等效于 2017-01-15 12:00:00(在伦敦和 UTC 中)。只需相应地更改值,测试就会通过。

【讨论】:

  • :facepalm: 谢谢!
【解决方案2】:

在这种转换中涉及很多玩家,其中有几个:

  • 2 个不同时区的当地时间
  • 当地时区规则(BST、GMT 与 WET;CET/CEST 等)

解决方案:使用java.time classes 处理您需要的所有内容。

看着你,ZonedDateTime

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2014-09-26
    • 2021-09-05
    相关资源
    最近更新 更多