当前位置: 首页 > 面试题库 >

Joda时区与JDK的时区不同

傅朝
2023-03-14
问题内容

在我的客户中,我有以下代码:

System.out.println("Java tz: " + TimeZone.getDefault());
System.out.println("Joda tz: " + ISOChronology.getInstance());

这两条线接连地运行。我从不设置时区或user.timezone手动设置,仅依靠从OS和本地系统读取的默认设置。

执行后,它们产生:

Java tz: sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
Joda tz: ISOChronology[America/Phoenix]

系统时区确实是Phoenix,而不是UTC。Joda如何正确而JDK如何错误?

编辑 :这是Windows 7 x64主机,JRE是1.6.22 x64。

编辑2
:不要尝试复制它。它只会在某些系统上失败,而不是在所有系统上失败(例如3k用户群中的几十个)。我已经知道乔达检查user.timezone,然后TimeZone.getDefault()。因此,我正在寻找一种解释,TimeZone直接打电话给我和Joda自己做之间有什么区别。


问题答案:

当您说“从操作系统和本地系统读取默认值”时,没有一个明确定义的地方可以读取此默认值。甚至API文档本身也说

获取TimeZone此主机的默认值。默认值的来源TimeZone可能会因实现方式而异。

因此,简单的答案是Joda和您的JVM从不同的信息源推断默认时区。需要记住的一点是, 默认值是一个guess ,而不是JVM绝对可以访问的值。

对于Linux上的Sun的1.5.0_06 JVM,使用以下顺序:

  1. 期待环境变量TZ
  2. 查找文件/ etc / sysconfig / clock并尝试找到“ ZONE”条目。
  3. 递归比较/ etc / localtime中的内容与/ usr / share / zoneinfo中每个文件的内容。当内容匹配时,它将返回从/ usr / share / zoneinfo引用的路径和文件名。

Joda 1.6.2使用:

  1. 系统属性user.timezone
  2. 如果以上null不是有效标识符,TimeZone则使用JDK的默认值。
  3. 如果失败,UTC则使用。

因此, 如果
您具有上述版本的JDK和Joda,建议user.timezone您在您的环境中设置该属性。但是,其他版本可能会使用其他算法来获取默认值。

编辑:在Sun的JDK
1.6.0_22中,默认搜索user.timezone也会首先检查该属性,如果找不到该user.country属性,则它将查找该属性以获取某个国家的默认值。如果两者均未设置,GMT则使用默认值。因此,您观察到的结果可能会随JVM版本而改变。

编辑2:如果您同时拥有两个源(实际上两个源均可用),则只需对其进行跟踪即可!逐步执行Joda调用,以查看它是否确实遵从java.util.TimeZone.getDefault(),并查看返回的值是什么。然后直接调用JDK方法,然后看得到什么。

查看JDK源代码,似乎默认时区是通过可继承线程本地访问的。因此,如果有人在某处打电话TimeZone.setDefault(),则可能在其他线程中可见,也可能看不见,这取决于他们是否已经查看了该版本。如果您从调试调用中获得明显的异常结果,则很可能是由于
不同的线程可能具有不同的默认TimeZones造成的



 类似资料:
  • 问题内容: 我有两个时间戳,它们以两种不同的格式描述同一时刻。 和。 我用Joda-Time用两个不同的日期格式解析时间戳。最后,我想有两个DateTime对象,它们在同一时刻相同。 DateFormatter提供了几种控制时区和语言环境的方法,但我无法使其正常工作。 这是我想工作的代码: 问题答案: 如果您的默认时间zome是Europe / Berlin,则2010-10-03 18:58:0

  • 我在两个地方为一个组织工作。其中之一是智利,那里的夏令时极难预测,往往每年都有变化。我们有一个依赖于时间的应用程序,直到现在,一直在使用joda time。当智利政府决定更改夏令时,我们使用joda代码将偏移量设置为默认的: 另外,在Java8Time中转换单元的最佳方法是什么?假设我有24小时,我想把它换算成几天。(我这样问是因为在这种情况下,似乎很多方法都是以毫秒为单位工作的,而我想要以小时为

  • 问题内容: 要求是简单地获取给定时区的当前时间( 包括正确的DST调整 )。 SO似乎在这方面徘徊了一些问题,但是我似乎找不到以节省时间的低摩擦方式得出的直接答案(在SO,Joda doco或谷歌搜索中)。似乎在给定的输入(当前UTC时间和所需的TZ)下,我应该能够从Joda Time库中链接几个方法来实现我想要的功能,但是在上述示例中似乎希望评估+处理偏移量/应用程序代码中的转换- 如果可能的话

  • 我试图使用Joda库的DateTimeFormatter从字符串解析DateTime对象。出于某种原因,当它到达要解析的时区时,它会引发异常。 下面是我的代码: 注意:我确实用模式字符串和字符串尝试了这种方法,但是获得数字偏移量对我来说不太方便,所以我希望有一个使用时区ID的解决方案。

  • 问题内容: 假设一个星期前,我生成了2015-10-10T10:00:00的LocalDateTime。此外,假设我这样生成当前的时区ID 我的zoneId是“美国/芝加哥”。 有没有一种简单的方法可以将我的LocalDateTime转换为时区ID“ America / New_York”(即,我更新的LocalDateTime为2015-10-10T11:00:00)? 更重要的是,无论我处于哪

  • 问题内容: 我正在从数据库中获取UTC时间戳,这是我设置为JodaTime 实例的时间 它完美地存储了时间,但带有本地时区。例如,我处于IST时区,即UTC的+5:30 我尝试了很多更改时区的方法,但每件事都会通过使用+5:30时差将时间从其他时间更改为其他时间 有什么方法可以更改TimeZone而不影响当前时间 编辑:如果我当前时间是: 以下是我使用这个的结果 以下是当我使用它的结果; 问题答案