Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将输入字符串日期时间从不同时区转换为UTC_Java_Datetime_Timezone - Fatal编程技术网

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

Java 将输入字符串日期时间从不同时区转换为UTC,java,datetime,timezone,Java,Datetime,Timezone,位于新加坡(时区-“亚洲/新加坡”)的我的系统从印度尼西亚(时区-“亚洲/新加坡”)的外部系统接收字符串datetime(yyyy-MM-dd HH:MM:ss) 在java 1.7中,如何将收到的字符串datetime转换为UTC 这是我的代码: public void convertToUtc() { String inputTime = "2018-02-02 10:09:00"; TimeZone inputTz = TimeZone.getTimeZone("Asia/

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

在java 1.7中,如何将收到的字符串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
}

我检查了你的密码时区有个拼写错误,所以我改正了

  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. 
  }
这是正确的。然而,我认为真正的问题是,旧的(而且早已过时的)
时区
类表现糟糕,不会通知您拼写错误。毕竟,我们都能做到。因此,真正的解决方案是使用java.time,即现代java日期和时间API。在Java 7(和6)上,将ThreeTen Backport添加到项目中,导入:

import org.threeten.bp.ZoneId;
然后:

        ZoneId inputTz = ZoneId.of("Asia/Jarkarta");
这将为您提供一个
org.threeten.bp.zone.zoneRuleException:未知时区ID:Asia/Jarkarta
。我应该说,这大大增加了你发现拼写错误的机会(正确的拼写是Asia/Jakarta)

说它回来了

指定的时区或GMT时区(如果无法指定给定ID) 明白

然而,我张贴这个答案,因为你的问题不仅仅是一个单独的例子。我们一次又一次地看到来自旧日期和时间类的堆栈溢出问题,这些问题表现出令人惊讶的行为,特别是我们传递给它们的数据中没有检测到容易检测到的问题。我强烈建议使用现代API

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

链接
  • 解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

请提供一些说明您尝试了什么。可能的程序副本还可以。问题是时区使用中的拼写错误,如“Asia/Jakarta”,谢谢您指出。太尴尬了。花了一个小时调试那个。麻烦的旧
时区
类。假装一切正常,给你GMT而不是你想要的时区。如果您只能使用java.time和它
ZoneId
class。嘿,你可以!!查看java.time到Java6和Java7的后端口。