2012-04-25 192 views
0

对不起,如果这是重新发布。我没有找到合适的答案。Java和Windows区域设置

请忽略最佳做法和使用已弃用的apis。

我想 “周一5月19日2时16分52秒2003 EDT” 格式化以下日期为 “MM/DD/YYYY HH:MM:SS”。同样,我只想改变输出格式,并且正在我的笔记本电脑上正在执行的东西。

我的Windows区域设置有:

当前时区:东部夏令时间

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

自动调整夏时制变化的时钟:Ch ecked

这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 

现在我改变窗口设置为以下(仅取消DST设置)

当前时区:东部夏令时间

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

自动调整时钟为夏时制:经过

输出是:

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

问题:

  1. 为什么输出关闭了一个小时?
  2. 即使格式化,java是否使用Windows DST设置?我虽然java维护自己的数据为不同时区的DST设置时间。
+1

是的, Java使用OS settin不管是Windows还是其他操作系统 – GETah 2012-04-25 19:46:47

+0

为什么java会改变我的输出呢?我告诉java要使用什么日期以及输出什么格式。 – user1318311 2012-04-25 19:50:22

回答

1

在内部,日期是通过一个长的值来存储的,该值表示经过某个时期的毫秒数。当您在机器上点击夏令时时,您改变了您的时区。因此,Java使用相同的时间编号和不同的时区,这就是为什么你有你所拥有的

+0

谢谢。这很有帮助。 – user1318311 2012-04-25 19:53:18

+0

当您满意时,请检查正确答案(可能需要等待) – ControlAltDel 2012-04-25 19:56:04

1

因为夏天的时间比正常的要早一个小时。将您的日历设置为一月,您将看不到任何区别。

+0

有趣。那么Java何时使用Olson时区数据库,如果它最终使用操作系统设置 – user1318311 2012-04-25 19:53:37

0

这是因为默认情况下,SimpleDateFormat在您的系统时区中打印日期。要检查它,请添加时区输出以格式化为:“MM/dd/yyyy HH:mm:ss z”因此,您会看到它在实际打印时间的时区。

如果你想控制,你想在什么时区格式化值,使用DateFormat.setTimeZone(TimeZone z)方法。

1

当您创建Date时,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"));