在Java中构建TimeZone对象

问题描述:

我使用GMT-8,GMT,PST,EST等时区字符串构建Java TimeZone对象 这不考虑时区是否启用夏时制。现在有一个要求包括此检查,而不是将输入作为PDT或EDT进行输入,而将夏令时作为单独的标记给出。我不确定TimeZone是否有直接方法更改该TimeZone的dayLight保存属性。在Java中构建TimeZone对象

因此,如果我得到像PST和DaylightSaving这样的输入为true,那么我必须将字符串更改为PDT。甚至更糟糕的是,有时候我会得到像GMT-8或GMT-6这样的输入,并且Day标志为真或错误。有出路吗 ?

我不能使用第三方的时区相关的类

代码示例:

TimeZone timeZone = TimeZone.getTimeZone("EST"); 
TimeZone timeZone = TimeZone.getTimeZone("PST"); 
TimeZone timeZone = TimeZone.getTimeZone("GMT-8"); 
+0

“我不能使用第三方时区有关的类”为什么不?特别是当你可以用你的代码捆绑它们时? – Thilo 2010-12-22 05:14:58

我认为Java是应该由自己搞清楚,时区是否使用夏令时或没有,当这是活跃的。

因此,如果您尝试使用该时区格式化某个Date对象,则输出应反映夏令时。

无论是可靠的工作(考虑到这个领域的频繁变化),我不知道。您应该更新到最新的JVM以获取最新的时区数据库文件(如果您不能这样做,那么可以使用separate Time Zone Update tool)。

我会补充的唯一的另一件事是使用3个字母的时区标识符已弃用,如下所示从JavaDoc。你需要使用的名称,如图here

三字母时区ID

为了与JDK 1.1.x版本的兼容性,一些 其他三字母时区ID(如 为“PST” “CTT”,“AST”)也支持 。然而,它们的使用是 反对,因为同样的 的缩写经常用于 多个时区(例如, “CST”可以是美国的“中部标准 时间”和“中国标准时间”),并 Java平台那么只有 可以识别其中之一。

像“PST”和“GMT-8”这样的时区字符串通常不明确,并且通常不会告诉您夏令时规则是否有效。 (例如,“太平洋标准时间”是指“太平洋标准时间”和“巴基斯坦标准时间”。)

如果你想要得到的时区和夏令时的规则是正确的,你必须采用全时区名获得TimeZone对象;即表格的名称:“America/Los_Angeles”。可以使用ISO 8601 date/time values

必须更改大量代码,并且很难说服其他人获得批准。

那么,我会说你在这里没有多少选择...如果你想让你的代码获得时区,等等。

做一些调查研究,了解存在的问题,说明这个问题你的老板/客户端,让他们的应用程序不能得到夏令时的权利之间进行选择,而且采用的是更明智的日期格式,时区规范方法,一个。

你并不真正用你展示的例子代码来“建造”一个时区。您正在获取已在Java平台中配置的一个。

而且这些内置TimeZone对象已经具有有关是否使用夏令时的适当信息,何时启动等等。所有这些都是您提取时区的属性。

正如另一条评论所述,内置TimeZone对象的这些属性会随时变化。对Java运行时的更新会提取这些更改。

如果您确实想真正构建一个新的TimeZone实例,那么这个子类SimpleTimeZone似乎具有有用的构造函数。但是真的是这样,你不能使用内置的时区?看起来你正在接受一项比必要更大的工作。 TimeZone.getAvailableIDs()将为您提供Java运行时中TimeZone名称的列表。