将输入字符串日期时间从不同时区转换为UTC

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将输入字符串日期时间从不同时区转换为UTC相关的知识,希望对你有一定的参考价值。

我的系统位于新加坡(时区 - “亚洲/新加坡”)从印度尼西亚的外部系统(时区 - “Asia / Jarkata”)获得字符串日期时间(yyyy-MM-dd HH:mm:ss)。

如何在java 1.7中将收到的String datetime转换为UTC?

这是我的代码:

public void convertToUtc() {
    String inputTime = "2018-02-02 10:09:00";
    TimeZone inputTz = TimeZone.getTimeZone("Asia/Jarkarta");
    TimeZone utcTz = TimeZone.getTimeZone("UTC");

    SimpleDateFormat inputSdf = new SimpleDateFormat(DateTimeUtils.DATE_TIME_FORMAT);
    inputSdf.setTimeZone(inputTz);

    SimpleDateFormat utcSdf = new SimpleDateFormat(DateTimeUtils.ISO_DATE_TIME_FORMAT);
    utcSdf.setTimeZone(utcTz);

    // From time
    Date fromDate = null;
    try {
        fromDate = inputSdf.parse(inputTime);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // Convert to UTC
    String sUtcDateTime = utcSdf.format(fromDate);
    System.out.println("UTC: " + sUtcDateTime); // UTC: 2018-02-02T10:09:00.000Z. Expected 2018-02-02T03:09:00.000Z
}
答案

janith1024’s answer是正确的。但是,我认为真正的问题是旧的(和过时的)TimeZone课程表现不佳,并没有告诉你拼写错误。毕竟,我们都可以做到这一点。所以真正的解决方案是使用java.time,即现代Java日期和时间API。在Java 7(和6)上将ThreeTen Backport添加到您的项目中,导入:

import org.threeten.bp.ZoneId;

然后:

        ZoneId inputTz = ZoneId.of("Asia/Jarkarta");

这给你一个org.threeten.bp.zone.ZoneRulesException: Unknown time-zone ID: Asia/Jarkarta。我应该说这大大增加了你发现拼写错误的机会(正确的拼写是亚洲/雅加达)。

The documentation of TimeZone.getTimeZone()说它会回归

指定的TimeZone,如果无法理解给定的ID,则为GMT区域。

但是我发布这个答案是因为你的问题不仅仅是一个例子。我们一遍又一遍地看到来自旧日期和时间类的Stack Overflow问题显示出令人惊讶的行为,特别是没有检测到我们传递给它们的数据的问题,它很容易被发现。我非常热烈地建议使用现代API。

在Java 8及更高版本中,java.time是内置的,您应该使用子包而不是java.timeorg.threeten.bp导入日期和时间类。

链接

另一答案

我检查你的代码在时区有一个拼写错误,所以我纠正它

  public static void convertToUtc() {
    String inputTime = "2018-02-02 10:09:00";
    TimeZone inputTz = TimeZone.getTimeZone("Asia/Jakarta");
    TimeZone utcTz = TimeZone.getTimeZone("UTC");

    SimpleDateFormat inputSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    inputSdf.setTimeZone(inputTz);

    SimpleDateFormat utcSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    utcSdf.setTimeZone(utcTz);

    // From time
    Date fromDate = null;
    try {
      fromDate = inputSdf.parse(inputTime);
    }
    catch (ParseException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    // Convert to UTC
    String sUtcDateTime = utcSdf.format(fromDate);
    System.out.println("UTC: " + sUtcDateTime); // print this UTC: 2018-02-02 03:09:00. 
  }

以上是关于将输入字符串日期时间从不同时区转换为UTC的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UTC 格式的字符串转换为特定时区的日历?

JavaScript:将 UTC 日期时间转换为传递时区的日期时间

将 UTC 日期格式转换为本地 nsdate

将 UTC 日期时间字符串转换为本地日期时间

Angularjs日期过滤器将时间毫秒转换为UTC不起作用

将UTC日期格式转换为本地nsdate