我的一台机器上遇到了非常奇怪的问题。我编写了一个程序,它监视来 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/