为什么即使我设置了时区,Java也显示错误的时间(提前1小时)?

为什么即使我设置了时区,Java也显示错误的时间(提前1小时)?,java,date,datetime,Java,Date,Datetime,大家好,我对Java中的Date对象有一些问题,实际上如果我实例化一个空的Date实例: Date date = new Date(); System.out.println("Date = " + date); 它的价值是23:30,而我在莫斯科,这里的时间是22:30 如果我尝试使用自定义格式并使用SimpleDataFormat对象设置时区,如下所示: Date date = (Date) prop.getValue(); SimpleDateFormat sdf = new Simpl

大家好,我对Java中的Date对象有一些问题,实际上如果我实例化一个空的Date实例:

Date date = new Date();
System.out.println("Date = " + date);
它的价值是23:30,而我在莫斯科,这里的时间是22:30

如果我尝试使用自定义格式并使用SimpleDataFormat对象设置时区,如下所示:

Date date = (Date) prop.getValue();
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy, HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
System.out.println("Date = " + sdf.format(date));
我还有一个1小时的开销
Date=23:35
,而我所在的正确时间是22:30

还有一个问题是JVM的默认时区设置正确:

System.out.println("TIMEZONE : " + TimeZone.getDefault().getID());
实际输出
时区:欧洲/莫斯科

那么实际上,问题出在哪里呢


编辑:我找到了解决方案,请看下面的答案。

我找到了解决此问题的方法

1) 去

2) 下载.zip,解压缩它,关闭当前运行的所有java应用程序,转到tzupdater-1.4.9-2014i文件夹

3) 打开命令行shell并键入:

$ java -jar tzupdater.jar -u
可能需要Root权限

之后,重新启动Java应用程序,现在:

 System.out.println(new GregorianCalendar().getTime());
 System.out.println(new java.util.Date());

两者都将输出2014年12月14日太阳00:02:59,这是莫斯科当前的正确时间,不需要额外的一小时

这是因为莫斯科是亚洲而不是欧洲。还有普京-库伊洛,拉-拉-拉-拉-拉。根据维基百科的说法,俄罗斯从永久性的夏令时改为永久性的标准时间;就在今年。我有过一次类似的经历(不是java/JVM语言),问题是关于DST的,它可能也值得检查。@user3019105您应该将您的解决方案添加到答案中并接受它。这样回答你自己的问题是非常好的,这样可以让你更容易阅读网站。或者,你可以使用。倾向于随着tz数据库的更新而发布。也大大优于与java捆绑的java.util.Date和.Calendar类。