【问题标题】:Convert input String date time from different timezone to UTC将输入字符串日期时间从不同时区转换为 UTC
【发布时间】:2018-03-02 06:17:42
【问题描述】:

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

如何在 java 1.7 中将接收到的字符串日期时间转换为 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
}

【问题讨论】:

  • 请提供一些你尝试过的东西
  • 程序没问题,问题是时区使用中的拼写错误,例如“亚洲/雅加达”
  • 嘿,感谢您的指出。好尴尬。花了一个小时调试。

标签: java datetime timezone


【解决方案1】:

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。我应该说这大大增加了您发现拼写错误的机会(正确的拼写是 Asia/Jakarta)。

The documentation of TimeZone.getTimeZone() 说它返回

指定的时区,或者如果给定的 ID 不能是 GMT 时区 明白了。

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

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

链接

【讨论】:

    【解决方案2】:

    我检查了你的代码,时区有拼写错误,所以我更正了它

      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. 
      }
    

    【讨论】:

    • 麻烦的老TimeZone类。假装一切都很好,给你格林威治标准时间而不是你想要的时区。如果您只能使用 java.time 和 ZoneId 类代替。嘿,你可以!!查看ThreeTen Backport,java.time 到 Java 6 和 7 的反向移植。
    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多