【发布时间】:2017-07-03 17:17:58
【问题描述】:
我有一个函数,我需要获取当前日期,设置为另一个时区,并将转换/格式化的日期作为Date 对象返回。我有有效的代码,但是,Date 对象没有设置为新转换的日期,它返回当前日期。
代码如下:
public static Date getCurrentLocalDateTime() {
Calendar currentdate = Calendar.getInstance();
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone obj = TimeZone.getTimeZone("America/Denver");
formatter.setTimeZone(obj);
Logger.info("Local:: " + currentdate.getTime());
String formattedDate = formatter.format(currentdate.getTime());
Logger.info("America/Denver:: "+ formattedDate);
Date finalDate = null;
try {
finalDate = formatter.parse(formattedDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Logger.info("finalDate:: " + finalDate);
return finalDate;
}
从我查看并尝试过的示例来看,这应该可以正常工作。其中一个问题是我需要返回 Date 对象,以便它与当前代码一起使用。
输出如下:
2017-07-03 17:08:24,499 [INFO] from application in application-akka.actor.default-dispatcher-3 -
Local:: Mon Jul 03 17:08:24 UTC 2017
2017-07-03 17:08:24,501 [INFO] from application in application-akka.actor.default-dispatcher-3 -
America/Denver:: 2017-07-03 11:08:24
2017-07-03 17:08:24,502 [INFO] from application in application-akka.actor.default-dispatcher-3 -
finalDate:: Mon Jul 03 17:08:24 UTC 2017
如您所见,它将日期正确格式化为山区时区,但随后将其设置回 Calendar 时间。
编辑---代码解决方案:
public static Date getCurrentLocalDateTime() {
Calendar currentdate = Calendar.getInstance();
ZonedDateTime converted = currentdate.toInstant().atZone(ZoneId.of("America/Denver"))
.withZoneSameLocal(ZoneOffset.UTC);
Date finalDate = Date.from(converted.toInstant());
return finalDate;
}
【问题讨论】:
-
为什么会有不同的结果?
-
根据上面的日志输出,我希望返回的日期是
Mon Jul 03 11:08:24 UTC 2017而不是Mon Jul 03 17:08:24 UTC 2017- 因为我将 Calendar 对象格式化为 Mountain Time。 -
恕我直言,有些人没有正确地完成他们的需求规范。在 2017 年,您不应被要求返回早已过时的
Date类的实例。 Java 日期和时间 API(从 Java 8 开始,向后移植到 Java 6 和 7)对于您和任何接收您的返回值的人来说都更好更好地使用。如果你可以返回一个ZonedDateTime对象,它就会有你选择的时区。
标签: java date datetime time timezone