位于新加坡(时区-“亚洲/新加坡”)的我的系统从印度尼西亚(时区-“亚洲/新加坡”)的外部系统接收字符串datetime(yyyy-MM-dd HH:MM:ss)。
如何在java 1.7中将收到的String日期时间转换为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.
}
janith1024的答案是正确的。然而,我认为真正的问题是,旧的(而且早已过时的)时区
类表现糟糕,不会通知您拼写错误。毕竟,我们都能做到。因此,真正的解决方案是使用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)。
TimeZone.getTimeZone()
的文档说明它返回
指定的TimeZone,如果无法理解给定ID,则为GMT区域。
然而,我张贴这个答案,因为你的问题不仅仅是一个单独的例子。我们一次又一次地看到来自旧日期和时间类的堆栈溢出问题,这些问题表现出令人惊讶的行为,特别是我们传递给它们的数据中没有检测到容易检测到的问题。我强烈建议使用现代API。
在Java8和更高版本中,Java.time是内置的,您应该使用子包从Java.time
导入日期和时间类,而不是从org.threeten.bp
导入。
java.time
的Date Time。 java.time
。 java.time
到Java6和7的Backport(用于JSR-310的Threeten)。 我有YYYYMMDD格式的日期字符串,我试图使用日期格式化程序将其解析为日期 如果我用不同的日期一遍又一遍地运行相同的结果,我会得到不同的输出 20120331>>英国夏令时>>格式化后的日期:SAT 3月31日01:00:00英国夏令时2012 20121231>>GMT>>格式化后的日期:Mon Dec 31 00:00:00 GMT 2012 20130328>>GMT>>格式化后的日期:T
问题内容: 我在mysql中使用NOW()获取当前日期和时间。我想将日期值转换为varchar并将其与另一个字符串连接。我该怎么做? 问题答案: 使用DATE_FORMAT()
问题内容: 例如字符串: 我将把它们推回到数据库中正确的日期时间字段中,因此我需要将它们魔术化为实际的日期时间对象。 这是通过Django的ORM进行的,因此我无法使用SQL进行插入时的转换。 问题答案: 是将字符串解析为日期时间的主要例程。它可以处理各种格式,格式由你为其指定的格式字符串确定: 生成的对象是时区未使用的。 链接: 适用于strptime:Python 2和Python 3的 Py
问题内容: 我从来没有不得不将时间与UTC转换。最近有人要求我的应用注意时区,并且我一直在圈子里奔波。我发现很多有关将本地时间转换为UTC的信息,这很基本(也许我也做错了),但是我找不到任何有关将UTC时间轻松转换为最终用户时区的信息。 简而言之,android应用程序向我发送了(appengine应用程序)数据,该数据中包含时间戳。要将时间戳存储为UTC时间,我正在使用: 那似乎行得通。当我的应
问题内容: 将日期转换为JSON时,javascript会以以下格式保存日期: 但是,我不确定如何将其放入python datetime对象。我已经尝试过这些: 我相信javascript会将字符串保存为官方ISO格式,因此似乎应该有一种方法可以让python 读取它? 问题答案: 请尝试以下格式: 例如: 该的日期只是手段,它应该被解释为UTC时间,所以忽略它不会造成任何信息丢失。您可以在这里找
问题内容: 我试图将字符串转换为日期时间对象。我从新闻提要中获取的字符串格式如下:“星期四,2014年10月16日美国东部时间01:16:17” 我尝试使用datetime.strptime()进行转换。即 并得到以下错误: 追溯(最近一次通话最近): 文件“”,第1行,位于datetime.strptime(’Thu,16 Oct 2014 01:16:17 EDT’,’%a,%d%b%Y%H: