我的一台机器上有一个完全奇怪的问题。我编写了一个程序来监控来自我们服务器的事件并将它们显示在监控电脑上。但是,每个事件状态消息还包含一个 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 -> "date"和系统偏好检查)
我很欣赏这个问题的任何答案。感谢您的时间!
自 25 日以来,该问题已得到解答。我已经实现了对 Timezone.setDefault() 的显式调用,以确保始终显示正确的时区。我现在关闭这个问题。
谢谢大家的答案!
最佳答案
这段代码:
cal.getTime()
返回
Date
目的。一个 Date
object 只是 UTC 时间的包装器,作为 long
.在您向我们展示的代码中,执行 sdf.format(new Date());
一样正确。DATE_FORMAT_NOW
是什么格式?我假设您自己指定了这一点。您是否以这种格式指定时区?编辑 正如您在评论中提到的, DATE_FORMAT_NOW 没有指定时区。你应该同时做
Timezone.getDefault()
和 sdf.getTimezone()
查看该值是否已更改为您的语言环境 + 3 小时。编辑2 我找到了this forum post关于时间的零星变化。在这种情况下,它是由调用
Timezone.setDefault(...)
的 Oracle 驱动程序引起的。在方法的中间,然后将其设置回来。
关于java - 可疑的 JVM 时间行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7186643/