我是java的新手,因此很长一段时间以来都无法解决这个问题。
我使用的是Windows XP,机器设置为TimeZone:Eastern Time(美国和加拿大)。
我有一个Java应用程序,它获取当前系统时间和时区信息,并将如下字符串:20101012 15:56:00 EST写入文件。
上面的最后一个日期,即:时区,随着我改变系统日期,从EST变为EDT。
准确:从11月(例如:2009年11月)到3月(2010年3月),它是EST,否则是EDT。
EST是我想要的而不是EDT。
是否有任何特定的类/功能,我总是可以将其作为EST读取?
等待回复。
谢谢你的回复。
好吧,我忘了提几件事。
我希望我的机器在Windows时区设置中设置为:Eastern Time(US& Canada)。
简单来说,我想做的是:获取我的机器时间,并将其写入文本文件
我知道从3月到11月发生的夏令时。
但问题是,当我将机器时间写入文件时,如果不存在夏令时(DST),则写为2010 01 12 15:56:00美国东部时间,如果是夏令时,则为20101012 15:56:00当下。
我担心的是,无论是否是夏令时,我都想写EST。
如果文件中的时间是20101012 15:56:00 EDT,您要将其读作20101012 15:56:00 EST还是20101012 14:56:00 EST? 我敢说你正在计算时间偏移,你会因时间的变化而受到灼伤。
如果这是出于记录原因,请考虑将时间记录为UTC。
我不认为你应该做你的建议。
您说无论您的系统时区当前是什么(东部时间不是您的时区,但UTC + 5或+4是),您希望它显示EST。这显然是错误的。假设它是在夏天,你的电脑认为它是在本地的2010/6/15 15:00。您打印当前时间,您得到:
The time I print this out at: 2010 06 15 15:00:00 EDT
无论出于何种原因,您认为EDT令人不快,因此您将其更改为EST:
I print this out at: 2010 06 15 15:00:00 EST
但是,如果你在接下来的一小时内将该片段发送给其他人,他们将被迫认为你是从未来走过的!美国东部时间15:00:00是美国东部时间16:00:00。
哈哈......很好的例子。你说得对。但是,我正在处理一个我需要告诉的服务器:"在20101015 15:30:30执行任务xxx"xxx是时区。无论月份是什么,服务器都只能理解EST而不是EDT。因此,EDT令人不快。
我会创建一个自定义区域:
TimeZone alwaysEst = TimeZone.getTimeZone("EST+5");
这将报告为EST,并将始终比UTC早5个小时。特别是,不要选择现有时区,否则当区域更新更改定义时最终会被烧毁。
请注意,通过强制EST,您记录的日期将仅匹配系统在一年中的5个月显示的时间。其他7个月你将休息一小时。它可以简化解析文件,但会使用户感到困惑。
解决方案取决于你为什么要写这个时间以及你在阅读它时想要用它做什么(它将用于做什么,而不是"你想要什么")。总是把它写成EST是对事实的误解。当EDT生效时,它实际上不是EST。如果你想跟踪一些"绝对"的时间点,我建议你使用GMT而不是任何时区。
斯蒂芬,你是对的。回答你的问题,这就是书面时间的使用方式 - 我正在处理一个我需要告诉的服务器:"在20101015 15:30:30执行任务"(这是我写的时间字符串)提交)。 xxx是时区。服务器只知道EST而不是EDT,无论哪个月。将EDT写为EST是对事实的误解,我同意。但我有点被迫这样做。
你的问题仍然不明确。
如果您只是想强制'EST'字符,即使您的机器设置为自动切换DST,或者您想要获得EST上的实际时间,我也没有理解。
所以你有两个选择:
您的机器时间设置为下午2:15并且DST开启,并且您希望在美国东部时间下午2:15(这不是正确的实际时间)写入您应该使用SimpleDateFormat。这样,你就会撒谎。但是,无论如何,你知道什么最适合你。
你的机器时间设置为下午2:15,DST开启,你要写东部时间下午1:15,你应该使用:TimeZone.setDefault(TimeZone.getTimeZone("EST"))
感谢您带来的清晰度。我希望实现选项1,这是不正确的意义。能否详细说明一下,我如何使用SimpleDateFormat将其写为美国东部时间下午2点15分!谢谢
尝试System.out.println(new SimpleDateFormat("yyyyMMdd hh:mm:ss a'EST'")。format(yourDate));并看到结果。查看SimpleDateFormat javadoc,了解您拥有的无数模式字母。
值得注意的是,在东部时区的夏季,几乎每个主要中心都使用夏令时,因此您可以正确地显示该时区的人们关心的时间。
如果你想要它是一个特定的时区,而不是默认的/系统时区,那么你可以通过以下方式强制TimeZone到EST:
TimeZone est = TimeZone.getTimeZone("EST");
虽然正如迈克尔上面提到的那样,文档建议使用本地全名,例如"America / New York"而不是一般的时区缩写。
如果你想声称它确实是EST,即使你知道它是EDT,那么我想你可以做到以下几点:使用一个不包含时区信息的自定义模式的SimpleDateFormat实例,然后" EST"在你写出的String的末尾。
the machine is set to TimeZone:
Eastern Time (US & Canada).
这不是一个真正的时区(EDT和EST都不是)。时区(如Java所理解的)类似于"America / Phoenix",它是管理时区的ID,它具有基本偏移和(可选)切换到特定日期的夏令时。这两者都可以改变,在解释历史日期时有必要考虑这些变化。
因此,如果您不想使用DST开关,请选择不遵守DST的时区。可能没有这样的时区,并试图采取行动,因为会引入不可能的日期。