0

Java 应用程序将事件写入日志文件,包括时间戳(从 Date.toString() 返回),而时间戳又包括时区。在我使用的 Windows 机器上,我看到 Date.toString() 返回的字符串具有表示为三个字符的字符串(例如“CST”)的时区。但在某些客户机器上,日期被写入日志文件,时区表示为与 GMT 的偏移量(例如“GMT-06:00”)。

我们有一个工具可以解析日志文件的文本以获取各种信息,但不幸的是,它的原始实现采用三字符表示,并且不适用于具有 GMT 偏移表示的日志文件。我们已经修复了该工具,现在对此无动于衷,但我们希望能够建议运行旧版本并且由于其字符串具有 GMT 偏移时区而遇到此问题的客户,他们可以获得如果他们更改系统设置以便他们的日志文件使用三个字符串的时区字符串写入,则该工具开始工作。此外,我们希望在未来的测试计划中考虑这种可变性,以确保我们使用每种设置进行测试。但我无法确定到底是什么在 Windows 设置中告诉 Java 使用“CST”与使用“GMT-06:00”。

我看到了几个与时区相关的注册表设置,但没有任何我可以清楚地识别为控制该特定选择的设置。一些注册表设置引用 tzres.dll。选择是否融入其中? Windows 上是否有任何简单的方法可以让 Date.toString() 使用一个时区表示与使用另一个时区表示来制定其字符串?

4

1 回答 1

0

我不知道这种行为差异的确切原因,但我可以猜到。时区是与 UTC 的偏移,有关该特定异常的历史信息例如夏令时。某些机器(或 JVM 默认值)可能仅设置为偏移量而不是特定的命名时区。

java.util.Date 类通常是出了名的麻烦,应该避免。具体来说,这toString在两个方面很糟糕。(A) 正如您所发现的,它用于生成字符串的格式不好。(B) 应用 JVM 的默认时区。该应用程序会导致混淆,因为它暗示 Date 有一个时区,而实际上它没有。此方法仅应临时用于快速和肮脏的目的,绝不能用于记录。

使用体面的日期时间库。这意味着 Joda-Time 或 Java 8 中的新 java.time 包。默认情况下,两者都使用合理且有用的ISO 8601格式。

通常,最佳做法是在 UTC 时区进行登录(无偏移)。

例子:2014-05-04T10:36:34Z

要在 Joda-Time 中生成这样的值:

String output = new DateTime( DateTimeZone.UTC ).toString();

如果您的问题是“如何更改运行我无法更改的应用程序的 JVM 使用的时区?”,一种解决方案是通过在启动 JVM 时传递参数来设置 JVM 的时区。看到这个问题

于 2014-05-05T07:54:37.657 回答