0

对不起,如果这是一个重新发布。我没有找到合适的答案。

请忽略最佳实践和已弃用的 API 的使用。

我想将以下日期“ Mon May 19 02:16:52 EDT 2003 ”格式化为“ MM/dd/yyyy HH:mm:ss ”。同样,我只想更改输出格式,这是从我在 EST 中的笔记本电脑上执行的。

我的 Windows 区域设置是:

当前时区:东部夏令时间

时区:(GMT-05:00) 东部时间(美国和加拿大)

为夏令时更改自动调整时钟:选中

这个java代码做到了:

Date aDate = new Date("Mon May 19 02:16:52 EDT 2003");
SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy HH:mm:ss");
System.out.println("Formatted Date: " + sdf.format(aDate));

输出是

Formatted Date: 05/19/2003 02:16:52

现在我将 windows 设置更改为以下(仅取消选中 DST 设置)

当前时区:东部夏令时间

时区:(GMT-05:00) 东部时间(美国和加拿大)

为夏令时更改自动调整时钟:选中

输出是:

Formatted Date: 05/19/2003 01:16:52

问题:

  1. 为什么输出减少了一个小时?
  2. java在格式化时是否使用Windows DST设置?我虽然 java 为各种时区的 DST 设置时间维护自己的数据。
4

4 回答 4

1

因为夏季时间比正常时间早一小时。将你的日历设置为一月,你会发现没有什么不同。

于 2012-04-25T19:49:00.920 回答
1

在内部,日期由一个 long 值存储,该值表示某个时期过去的毫秒数。当您在您的机器上单击夏令时时,您更改了您的时区。所以Java使用不同时区的相同时间编号,这就是为什么你拥有你所拥有的

于 2012-04-25T19:50:07.863 回答
1

创建日期时,Java 会在内部将值存储为 GMT。当您将日期格式化为字符串时,Java 将使用您的计算机时区将日期转换为您的本地时区,这就是您得到不同结果的原因。例如,如果我在我的计算机上运行以下代码(使用时区 CEST):

System.out.println(new Date("Mon May 19 02:16:52 UTC 2003"));
System.out.println(new Date("Mon May 19 02:16:52 EDT 2003"));
System.out.println(new Date("Mon May 19 02:16:52 PST 2003"));

我得到以下结果:

Mon May 19 04:16:52 CEST 2003
Mon May 19 08:16:52 CEST 2003
Mon May 19 12:16:52 CEST 2003

如果您想要更可预测的结果,您可以不在输入中提供时区(例如,只要输入和输出在同一时区执行,它就保持不变)或使用更可靠的方法来指定要使用的时区采用:

SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("EDT"));
于 2012-04-25T20:09:49.100 回答
0

这是因为默认情况下 SimpleDateFormat 在您的系统时区打印日期。要检查它,请将时区输出添加到格式:"MM/dd/yyyy HH:mm:ss z" 这样您就会看到它实际在哪个时区打印值。

如果要控制要在哪个时区格式化值,请使用 DateFormat.setTimeZone(TimeZone z) 方法。

于 2012-04-25T19:57:32.823 回答