可疑的JVM时间行为

时间:2011-08-25 07:34:28

标签: java time jvm

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

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

与     public static final String DATE_FORMAT_NOW =“yyyy-MM-dd HH:mm:ss”;

我希望这个电话可以返回当地时间,直到今天这个时间很长。但现在我的节目向我展示了每个传入活动的当地时间+3小时。重启jar文件根本没有帮助,系统时间也正确设置。该程序在一台机器上运行,该机器将其时间与中央企业时钟同步。

任何人都可以解释我提到的行为和/或陈述一个可能的解决方案,而不是“重启机器再试一次”:-)?

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

我很欣赏这个问题的任何答案。谢谢你的时间!


该问题自25日起已经回答。我已经实现了对Timezone.setDefault()的显式调用,以确保在整个时间显示正确的时区。我现在关闭这个问题。

谢谢大家的回答!

1 个答案:

答案 0 :(得分:1)

此代码:

cal.getTime()

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

是正确的

格式DATE_FORMAT_NOW是什么?我假设你自己指定。您是否以此格式指定时区?

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

EDIT2 我发现this forum post关于零星偶尔发生变化的时间。在这种情况下,它是由Oracle驱动程序在方法中间调用Timezone.setDefault(...)引起的,然后再将其设置回来。