我的一台机器上有一个完全奇怪的问题。我编写了一个程序,它监视来自我们服务器的事件并将它们显示在监视器上。但是,每个事件状态消息还包含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()的显式调用,以确保在整个时间显示正确的时区。我现在关闭这个问题。
谢谢大家的回答!
答案 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(...)
引起的,然后再将其设置回来。