JAVA TimeZone发行EDT Vs EST

我是java的新手,因此很长一段时间以来都无法解决这个问题。

我使用的是Windows XP,机器设置为TimeZone: Eastern Time(美国和加拿大)

我有一个Java应用程序,它获取当前系统时间和时区信息,并将如下字符串:20101012 15:56:00 EST写入文件。

上面的最后一条日期,即:时区,随着我改变系统日期,从EST变为EDT。

准确:从11月(例如:2009年11月)到3月(2010年3月),它是EST,否则是EDT。

EST是我想要的而不是EDT。

是否有任何特定的类/function,我总是可以将其作为EST读取?

等待回复。


谢谢你的回复。 好吧,我忘了提几件事。

  1. 我希望我的机器设置为:在Windows时区设置中的东部时间(美国和加拿大)。

  2. 简单来说,我想做的是:获取我的机器时间,并将其写入文本文件

  3. 我知道从3月到11月发生的夏令时。

但问题是,当我将机器时间写入文件时,如果夏令时(DST)不存在,则写为2010 01 12 15:56:00美国东部时间,如果夏令时为20101012 15:56:00当下。 我担心的是,无论是否是夏令时,我都想写EST。

我认为你不应该做你的建议。

您说无论您的系统时区当前是什么(东部时间不是您的时区,但UTC + 5或+4是),您希望它显示EST。 这显然是错的。 假设它是在夏天,你的电脑认为它是在本地的2010/6/15 15:00。 您打印当前时间,您会得到:

我打印出来的时间是:2010 06 15 15:00:00美国东部时间

无论出于何种原因,您认为EDT令人不快,因此您将其更改为EST:

我打印出来的时间是:2010 06 15 15:00:00 EST

但是,如果您在接下来的一小时内将该片段发送给其他人,他们将被迫认为您将来旅行! 美国东部时间15:00:00是美国东部时间16:00:00。

我会创建一个自定义区域:

 TimeZone alwaysEst = TimeZone.getTimeZone("EST+5"); 

这将报告为EST,并将始终比UTC早5个小时。 特别是,不要选择现有时区,否则当区域更新更改定义时最终会被烧毁。

请注意,通过强制EST,您记录的日期将仅匹配系统在一年中的5个月显示的时间。 另外7个月你将rest一小时。 它可以简化解析文件,但会使用户感到困惑。

值得注意的是,在东部时区的夏季,几乎每个主要的中心都使用夏令时,因此您可以正确地看到该时区​​的人们关心的时间。

如果您希望它是特定的时区,而不是默认/系统时区,那么您可以通过以下方式强制TimeZone到EST:

 TimeZone est = TimeZone.getTimeZone("EST"); 

虽然正如迈克尔上面提到的那样,文档建议使用本地全名,例如“America / New York”而不是一般的时区缩写。

如果你想声称它确实是EST,即使你知道它是EDT,那么我想你可以做到以下几点:使用一个SimpleDateFormat实例和一个不包含时区信息的自定义模式,然后添加“EST”在你写出的字符串的末尾。

你的问题仍然不明确。

如果您只想强制’EST’字符,即使您的机器设置为自动chage DST,或者您想要获得EST上的实际时间,我也没有理解。

所以你有两个选择:

  1. 您的机器时间设置为下午2:15并且DST生效,并且您希望在美国东部时间下午2:15(这不是正确的实际时间)写入您应该使用SimpleDateFormat。 这样,你就会撒谎。 但是,无论如何,你知道什么最适合你。

  2. 您的机器时间设置为下午2:15并且DST开启,并且您想要在美国东部时间下午1:15写入,您应该使用:TimeZone.setDefault(TimeZone.getTimeZone(“EST”))

解决方案取决于你为什么要写这个时间以及你在阅读时想要用它做什么(它将用于做什么,而不是“你想要什么”)。 总是将其写成EST是对事实的误解。 当EDT生效时,它实际上不是 EST。 如果你想跟踪一些“绝对”的时间点,我建议你使用GMT而不是任何时区。

机器设置为TimeZone:Eastern Time(美国和加拿大)。

这不是一个真正的时区(EDT和EST都不是)。 时区(如Java所理解的)类似于“America / Phoenix”,它是管理时区的ID,具有基本偏移和(可选)切换到特定日期的夏令时。 这两者都可以改变,在解释历史日期时有必要考虑这些变化。

因此,如果您不想使用DST开关,请选择不遵守DST的时区。 有可能没有这样的时区,并试图采取行动,因为会引入不可能的日期。