Java 将输入字符串日期时间从不同时区转换为UTC
位于新加坡(时区-“亚洲/新加坡”)的我的系统从印度尼西亚(时区-“亚洲/新加坡”)的外部系统接收字符串datetime(yyyy-MM-dd HH:MM:ss) 在java 1.7中,如何将收到的字符串datetime转换为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/
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
- ,解释得非常透彻
时区类。假装一切正常,给你GMT而不是你想要的时区。如果您只能使用java.time和它ZoneId
class。嘿,你可以!!查看java.time到Java6和Java7的后端口。