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



我的系统位于新加坡(时区 - "亚洲/新加坡")从印度尼西亚的外部系统(时区 - "亚洲/雅各答")接收字符串日期时间 (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
}

janith1024 的答案是正确的。但是,我认为真正的问题是旧的(早已过时的)TimeZone类表现不佳,并且不会通知您拼写错误。毕竟,我们都可以做到这一点。所以真正的解决方案是使用java.time,现代Java日期和时间API。在 Java 7(和 6)上,将 ThreeTen 向后移植到您的项目中,导入:

import org.threeten.bp.ZoneId;

然后:

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

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

TimeZone.getTimeZone()的文档说它返回

指定的时区,或 GMT 区域(如果给定 ID 不能 理解。

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

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

链接

  • Oracle 教程:说明如何使用java.time的日期时间 .
  • Java 规范请求 (JSR) 310,其中首次描述了java.time
  • ThreeTen Backport 项目,将java.time向 Java 6 和 7 的反向移植(JSR-310 为 ThreeTen )。
  • ThreeTenABP,ThreeTen Backport 的安卓版
  • 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。

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

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

相关内容

  • 没有找到相关文章

最新更新