【发布时间】:2013-08-09 23:08:29
【问题描述】:
代码:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(new Date());
try {
String d = sdf.format(new Date());
System.out.println(d);
System.out.println(sdf.parse(d));
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
输出:
Thu Aug 08 17:26:32 GMT+08:00 2013
2013.08.08 09:26:32 GMT
Thu Aug 08 17:26:32 GMT+08:00 2013
请注意,format() 将 Date 正确格式化为 GMT,但 parse() 丢失了 GMT 详细信息。我知道我可以使用substring() 来解决这个问题,但是造成这种现象的原因是什么?
Here is a duplicate question 没有任何答案。
编辑:让我以另一种方式提出问题,检索 Date 对象以使其始终处于 GMT 的方式是什么?
【问题讨论】:
-
“解析丢失了 GMT”是什么意思?您在 GMT+0800 中给它一个日期,并告诉它在时区 GMT 中对其进行格式化,因此它会这样做(注意时间已更改)。这正是你要求它做的事情。
-
您在 SimpleDateFormat 上设置时区,并且未链接到日期。所以 println(date) 不会引用 SimpleDateFormat 中设置的时区
-
您对 Date 和 DateFormat 感到困惑,无论您在哪个时区,Date 对象总是相同的。 DateFormat 对象用于格式化您可以指定时区信息的日期。当您调用 parse 方法时,您的时间值已根据您的时区发生变化
-
@KevinBowersox:对,
Date没有时区。但是当你使用Date#toString时,它使用JVM的当前时区进行格式化。 -
@T.J.Crowder,所以你说的是它只是 toString ,它采用 JVM 的时区并相应地打印它。但是当我将 Date 对象传递给数据库时会发生什么,那么这些位是如何发送的呢?我想还会有一些日期格式?那么我如何保证,无论我在哪里运行代码,无论是在纽约、欧盟还是日本,我总是在 GMT 或 UTC 中拥有相同的日期
标签: java date simpledateformat gmt