3

我使用时区字符串(如 GMT-8、GMT、PST、EST 等)构建了一个 Java TimeZone 对象。这没有考虑时区是否启用了夏令时。现在需要包含此检查,而不是给出输入为 PDT 或 EDT,夏令时作为单独的标志给出。我不确定 TimeZone 是否有直接方法来更改该 TimeZone 的夏令时属性。

因此,如果我将 PST 和 DaylightSaving 之类的输入设为真,那么我必须将字符串更改为 PDT。更糟糕的是,有时我会得到诸如 GMT-8 或 GMT-6 之类的输入,而日光标志为真或假。有出路吗 ?

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

代码示例:

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

4 回答 4

3

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

如果要正确获取时区和夏令时规则,则必须使用完整的时区名称来获取 TimeZone 对象;即形式的名称:“America/Los_Angeles”。

或者使用ISO 8601 日期/时间值

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

好吧,我想说你在这里别无选择......如果你想让你的代码获得正确的时区等。

做一些研究,了解问题,解释你的老板/客户的问题,让他们在不能正确获取夏令时的应用程序和使用更合理的日期格式和时区规范方法的应用程序之间进行选择。

于 2010-12-22T05:49:50.503 回答
2

我要补充的唯一另一件事是不推荐使用 3 个字母的时区 ID,如下所示JavaDoc。您需要使用此处显示的名称

三个字母的时区 ID

为了与 JDK 1.1.x 兼容,还支持一些其他的三字母时区 ID(例如“PST”、“CTT”、“AST”)。但是,不推荐使用它们,因为相同的缩写通常用于多个时区(例如,“CST”可能是美国“中部标准时间”和“中国标准时间”),Java 平台只能识别其中之一他们。

于 2010-12-22T05:25:21.700 回答
1

我认为 Java 应该自己弄清楚时区是否使用夏令时,以及何时启用。

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

这是否可靠(鉴于该领域的频繁变化),我不知道。您可能应该更新到最新的 JVM 以获取最新的时区数据库文件(如果您不能这样做,可以使用单独的时区更新工具)。

于 2010-12-22T05:13:06.697 回答
1

您并没有真正使用您显示的示例代码“构建” TimeZone。您正在获取已在 Java 平台中配置的一个。

并且那些内置的 TimeZone 对象已经具有有关是否使用夏令时、何时开始等的适当信息。所有这些都是您正在获取的时区的属性。

正如另一条评论中提到的,内置 TimeZone 对象的这些属性会不时更改。Java 运行时的更新获取了这些更改。

If you did want to really build a new TimeZone instance, there's the subclass SimpleTimeZone that seems to have useful constructors. But is it truly the case that you can't use built-in TimeZones? Seems like you're taking on a bigger job than necessary. TimeZone.getAvailableIDs() will give you the list of TimeZone names in your Java runtime.

于 2011-01-01T14:58:25.487 回答