java - 可疑的 JVM 时间行为

标签 java time jvm

我的一台机器上遇到了非常奇怪的问题。我编写了一个程序,它监视来 self 们服务器的事件并将其显示在监视计算机上。但是,每个事件状态消息还包含一个由以下调用检索的 TIMESTAMP:

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
return sdf.format(cal.getTime());

与 公共(public)静态最终字符串DATE_FORMAT_NOW =“yyyy-MM-dd HH:mm:ss”;

我期待这个调用返回本地时间,直到今天为止,该时间一直运行良好。但现在我的程序向我显示每个传入事件的本地时间 +3 小时。重新启动 jar 文件根本没有帮助,并且系统时间也设置正确。该程序正在一台机器上运行,该机器正在将其时间与中央公司时钟同步。

任何人都可以向我解释上述行为和/或说明一个可能的解决方案,而不是“重新启动计算机并重试”:-) 吗?

悬崖: - 当我启动程序时,时间检索正在我的或任何其他机器上运行 - 目标机器 24/7 全天候运行,并且只是一台监控机器,因此没有人更改那里的任何选项 - 直到今天为止都运行良好。 - 主机系统 (Windows XP) 上的所有时间/时区设置均正确。 (通过 CMD ->“日期”以及系统偏好设置进行检查)

我很感谢对此问题的任何回答。感谢您的宝贵时间!

<小时/>

问题自 25 日起已得到解答。我已经实现了 Timezone.setDefault() 的显式调用,以确保始终显示正确的时区。我现在就结束这个问题。

谢谢大家的回答!

最佳答案

这段代码:

cal.getTime()

返回 Date目的。一个Date对象只是 UTC 时间的包装器,如 long 。在您向我们展示的代码中,执行 sdf.format(new Date()); 也是正确的。

格式DATE_FORMAT_NOW是什么? ?我假设您自己指定了这一点。您是否以这种格式指定时区?

编辑 正如您在评论中提到的,DATE_FORMAT_NOW 未指定时区。你应该同时做 Timezone.getDefault()sdf.getTimezone()查看该值是否已更改为您的区域设置 + 3 小时。

编辑2我发现this forum post关于时间偶尔发生变化。在本例中,这是由 Oracle 驱动程序调用 Timezone.setDefault(...) 引起的。在一个方法的中间,然后将其设置回来。

关于java - 可疑的 JVM 时间行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7186643/

相关文章:

java - 如何在灵活的 GAE 应用程序中正确设置 JVM 选项

compiler-construction - 如何创建自己的面向 JVM 的编程语言?

java - 无法将插件添加到Gradle构建文件中?

java - Java 代码生成器的更好方法?

algorithm - 了解 “before” 在编程任务中的使用

android - 如何测量移动应用程序的冷/热启动时间

php - PHP 可以使用本地主机时区吗?

java - Jasper Reports - 从 Java 中的 BaseColumn 类获取详细对象详细信息

java - Docker-java API 在 Windows 10 上的 Eclipse 中连接 virtualbox ubuntu docker

java - 多语言堆栈的集成测试(Java/MongoDB/RabbitMQ...)