- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的客户端中,我有这段代码:
System.out.println("Java tz: " + TimeZone.getDefault());
System.out.println("Joda tz: " + ISOChronology.getInstance());
这两条线一个接一个地跑。我从不手动设置时区或 user.timezone
,只依赖于从操作系统和本地系统读取的默认值。
执行时,它们产生:
Java tz: sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
Joda tz: ISOChronology[America/Phoenix]
系统时区确实是凤凰城,不是UTC。怎么可能Joda是对的,JDK是错的呢?
编辑:这是一个 Windows 7 x64 主机,JRE 是 1.6.22 x64。
编辑 2:不要尝试重现它。它只在一些系统上失败,而不是在所有系统上(比如我们 3k 用户群中的几十个)。我已经知道 Joda 检查 user.timezone
,然后检查 TimeZone.getDefault()
。所以我正在寻找一个解释,说明我直接调用 TimeZone
和 Joda 自己调用它有什么不同。
最佳答案
当您说“从操作系统和本地系统读取默认值”时,没有一个明确定义的位置可以从中读取此默认值。甚至 API 文档本身也说
Gets the default
TimeZone
for this host. The source of the defaultTimeZone
may vary with implementation.
所以简单的答案是 Joda 和您的 JVM 从不同的信息源推断默认时区。需要记住的一点是,默认值是一个猜测,而不是 JVM 可以明确访问的东西。
对于 Linux 上的 Sun 1.5.0_06 JVM,使用以下顺序:
Joda 1.6.2 使用:
user.timezone
。null
或不是有效标识符,则使用 JDK 的 TimeZone
默认值。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()
,它可能会或可能不会在其他线程中可见,具体取决于他们是否已经查找了该版本。如果您从调试调用中得到明显异常的结果,这很可能只是因为不同的线程可能有不同的默认时区。
关于java - Joda 时区与 JDK 的时区不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4374733/
我对第一个问题的直觉是肯定的。对于第二个问题,我在工作中确实看到,有人使用 JDK8 和 ANT,然后将用 JDK6 编写的旧包编译到 1.6。我真的很困惑。 最佳答案 一般来说,java 向后兼容所
据我所知,在windows中使用JDK有两种方式: 下载JDK安装文件并安装。 下载 JDK 二进制文件。 它们有什么区别? 最佳答案 优点:简单易行,突然间一切正常。 缺点:现在一切都使用新版本 -
我正在安装 HANA Studio,并且已下载 JDK 1.8 和 JDK 1.7。我将 JDK 1.8 用于 Eclipse 和我正在处理的其他一些事情,但是当我尝试通过 SAP HANA 生命周期
JDK 7 的哪些特性(不包括 invokedynamic,因为它不被 java 使用)导致新的类文件版本与 JDK 6 不兼容。似乎所有特性都可以通过编译器生成胶水代码来实现。例如 switch 语
在redhat机器上安装cloudera的库来创建cloudera集群是否必须使用Oracle JDK而不是Open JDK? 最佳答案 在撰写本文时,只有 Oracle JDK 版本经过认证可与 C
下面的语句在 Java 7 中有效吗? Timestamp.valueOf("0000-00-00 00:00:00.000000"); 因为使用 JDK 1.6 构建上述代码效果很好,但在使用 JD
更新 在整个评论中,结果证明我采用的基准测试方法是不正确的,因此结果具有误导性。纠正我的方法后(如已接受的答案),结果正如人们所期望的 - JDK 13 的性能与 JDK 11 一样好。有关更多详细信
我们很快就会从 jdk14 迁移到 jdk16。我们的是桌面应用程序。我需要采取什么措施来确保它在客户端机器上正常工作?现在他们中的一些人使用 JRE4 和一些 JRE6.Server-Solaris
我在/usr/lib/jvm 中有 jdk1.7.0 目录以及其他 open-jdk 版本。我希望我的 Ubuntu 12.04 将此 jdk(jdk1.7.0) 视为其主要 jdk,即我不想使用 o
我认为这可能与 Why does a generic cast of a List to List succeed on Sun JDK 6 but fail to compile on Oracle
代码使用 JDK 8 (1.8.0_212) 编译良好,但使用 JDK 11 (11.0.3) Oracle jdk 和 open jdk (aws corretto) 编译失败 尝试使用 javac
是否可以在 cygwin 上安装任何版本的 Sun JDK 或 Open JDK。 我寻找此选项的原因是:有许多工具(例如 jStack、jMap)在 JDK 的 unix 版本中可用,但在 wind
请确认以上说法? 当他们提到 JDK 时,我需要知道他们指的是什么。 最佳答案 Java Development Kit 是我们通常指的一组创建 Java 应用程序的工具,包括 Java Compil
使用 java -version 给我这个。 java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
这个问题在这里已经有了答案: JAVA_HOME should point to a JDK not a JRE (25 个答案) 关闭 4 年前。 您好,感谢您提供的任何帮助。 我刚刚升级到 Ub
没错,自阿里、腾讯之后,华为也终于开源了自家的 JDK——毕昇 JDK! 免费!免费!免费!!! Oracle 要慌了? 毕昇 JDK 毕昇 JDK 是华为内部 OpenJDK 定制版 Hu
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭去年。 Improve this quest
将 Arquillian 添加到 Maven 构建时,我在 Eclipse 中遇到上述异常: Missing artifact sun.jdk:jconsole:jar:jdk
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我正在尝试创建一个 pom,它将: 使用 maven-toolchains-plugin 中的正确 JDK基于 java.version 属性。 根据 maven-toolchains-plugin
我是一名优秀的程序员,十分优秀!