Java 可疑JVM时间行为

Java 可疑JVM时间行为,java,time,jvm,Java,Time,Jvm,我的一台机器出现了完全奇怪的问题。我已经编写了一个程序,用于监控来自服务器的事件,并将其显示在监控pc上。但是,每个事件状态消息还包含一个时间戳,该时间戳由以下调用检索: Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); return sdf.format(cal.getTime()); 与 公共静态最终字符串日期\u格式\u NOW=“yyy

我的一台机器出现了完全奇怪的问题。我已经编写了一个程序,用于监控来自服务器的事件,并将其显示在监控pc上。但是,每个事件状态消息还包含一个时间戳,该时间戳由以下调用检索:

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
return sdf.format(cal.getTime());
与 公共静态最终字符串日期\u格式\u NOW=“yyyy-MM-dd HH:MM:ss”

我期待着这个电话能在当地时间回电,直到今天,这个电话一直在工作。但现在,我的程序显示每个传入事件的本地时间+3小时。重新启动jar文件根本没有帮助,系统时间也设置正确。该程序运行在一台机器上,该机器的时间与中央公司时钟同步

是否有人可以向我解释上述行为和/或说明可能的解决方案,而不是“重新启动机器并重试”:-

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

我很欣赏对这个问题的任何回答。谢谢你抽出时间


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

谢谢大家的回答

此代码:

cal.getTime()
返回一个
日期
对象。
Date
对象只是UTC时间的包装,作为
long
。在您向我们展示的代码中,执行
sdf.format(newdate())同样正确

现在的格式是什么?我想这是你自己指定的。您是否用这种格式指定时区

编辑正如您在评论中提到的,日期格式现在没有指定时区。您应该同时执行
Timezone.getDefault()
sdf.getTimezone()
以查看该值是否已更改为您的语言环境+3小时


EDIT2我发现时间偶尔会变化。在这种情况下,它是由一个Oracle驱动程序调用<代码>时区。在方法中间调用StUntRead(…)<代码>,然后将它设置回。 您好,这是公共静态最终字符串DATE\u FORMAT\u NOW=“yyyy-MM-dd HH:MM:ss”。直到今天,上面提到的代码仍然运行良好。当我在我的机器或任何其他机器上启动程序时,它仍然正常工作。运行程序的机器正在全天候运行。
sdf.getTimeZone()
返回什么?您好,它显示了错误的时区,亚洲/卡拉奇。gettime命令仍然返回错误的时间。但系统时间已正确设置为本地时间(时区:GMT+2)。JVM如何自动更改其时区?更重要的问题是:如何在其运行时将其更改回原来的时区?timezone.getDefault()返回与sdf.getTimezone()相同的值,两者都是系统时间+3h:-(.我可以在JVM运行时以某种方式更改时区吗?例如“java-xyz”?这意味着某些东西正在设置默认时区。可能有一个库可以执行此操作,甚至您自己的一些代码。请参阅我的答案以获取示例。您好,是的,系统端的所有日期和时间选项都正确。我指的是日历和SimpleDataFormat对象的时区。请参阅下面我对答案1的评论。谢谢欧点