`
mengtaohj
  • 浏览: 23553 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中莫名其妙的时区错误

 
阅读更多

        前一阵子更新了系统,鸟枪换炮地装上了WIN7,可是项目却出现了莫名其妙的问题。我这个项目的客户端启动之后会从服务端获取系统时间,然后更新本地时间。但我发现每次启动客户端后,本地时间都会被改为8小时之前。起初我以为是服务器上系统时间错了,也就没管,一直以8小时前的本地时间进行调试。但是当这影响了我的作息时间,导致下班延后给人一种主动加班的表象时,我无法容忍了,决定到服务器上一看究竟。

这一看让我大跌眼镜(好吧,尽管我不带眼镜)——服务器时间是正确的。那问题究竟在哪里呢?于是设置断点,开始调试。当断点运行到

check.setSystemTime(new Date());

时,查看check对象的systemTime字段的值,居然是传说中的格林威治时间——8小时前。。。

也就是说new Date()出来的不是系统时间,是不是时区出问题了呢?一测试,果然。看下面的代码:

Date date = new Date();
System.out.println(date.toString());
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
System.out.println(System.getProperty("user.timezone"));
System.out.println(System.getProperty("user.country"));

 

结果如下:

Wed May 11 02:08:55 CST 2010
Wed May 11 02:08:56 CST 2010
GMT
CN

 

也就是说,系统的时区出现了问题。但是系统时区是完全正确的,

 

问题究竟出在哪里呢?

会是环境不兼容吗?

 

 

我的JDK是1.5版本,会不会是JDK太旧与WIN7不兼容,于是在获取当前时区时出现异常而默认取到了GMT呢?于是同样的环境在其他机器上测试,居然完全没问题。而且在网上搜索发现,在Java BUG的数据库中也早已有人报告了这个错误(但是一直没有解决),其中有人是XP,有人是2003。看来不是环境的问题了。

会是注册表的问题吗?

我们知道在注册表HLM\software\microsoft\window nt\currentversion\time zones下有关于各个时区的配置,会不会是由于安装了某个程序把这些配置破坏了呢?于是我从没有问题的机器上导出了一份该节点的注册表,导入到我的机器,奇迹出现了。。。

吗?

答案是没有,问题依旧。

会是人品问题吗?

还真有这个可能。同样的环境别人的机器没问题,而我的不行,不是RPWT是什么?但我是不相信宿命的。笼统上说环境大致相同,但肯定会有微小的差别,这种微小的差别是无法测评的。

实在没有办法,不得不求助于CSDN,有几位大牛耐心地帮我分析了问题,并提出了一些解决方案。

瞒天过海法

既然在目前的项目中只有我一台机器有这个问题,也许在这台机器上做点手脚就可以漫天过海了。

在Eclipse中打开Run对话框的Arguments选项卡,在VM arguments框的后面加入如下的参数:

-Duser.timezone=Asia/Shanghai

这样在调试或运行程序时,就会先更改时区。由于是本地的配置,不会对其他机器造成影响。

最终“解决方案”

也许重装系统可以解决,但是我懒,不愿重装。那么没有办法,只有升级JDK了。把1.5卸载,安装1.6,修改一下环境变量,再运行之前的程序,OK,整个世界终于清静了。

但是,问题的症结何在?

这篇文章摘抄别人的。想进去的点这个链接:点我、点我

分享到:
评论

相关推荐

    java.util.TimeZone 的世界时区列表

    - **Java中使用TimeZone** - **获取时区**:可通过`TimeZone.getTimeZone("时区ID")`方法获取指定时区。 - **默认时区**:`TimeZone.getDefault()`返回系统默认时区。 - **设置时区**:`TimeZone.setDefault(Time...

    java的时区问题

    解决Java中的时区问题,开发者需要关注以下几点: 1. **时区ID的使用**:确保使用正确的时区ID,避免使用过时的ID,比如"GMT"或"EST",应优先选择如"America/New_York"这样的地区性ID。 2. **夏令时处理**:Java...

    java时区问题

    了解和熟练掌握这些知识点,可以帮助开发者更准确地处理Java中的时区问题,避免因为时区差异导致的错误。在处理跨国或跨地区的应用时,尤其需要注意时区的影响,确保日期时间的正确显示和计算。

    java转换时区时间过程详解

    在Java中,我们可以使用java.util.TimeZone和java.util.Date类来实现时区时间转换。下面是一个简单的示例代码: ```java public static Date convertTimezone(Date sourceDate, String targetZoneId) { return ...

    java中 new date() 打印出的时间与系统时间错了八小时的解决方法

    总的来说,Java中`new Date()` 出现时间差的问题主要源于时区设置,可以通过调整JVM时区或者在代码中设定时区来解决。同时,不要忽视操作系统自身的时区设置,因为它可能会影响到其他非Java程序的时间显示。理解并...

    java国际化&时间处理

    首先,Java中的国际化主要依赖于`java.util.Locale`类,它代表了特定的语言环境,包括语言、国家和地区。例如,`Locale.CHINA`表示简体中文环境,`Locale.US`则代表美国英语环境。开发者可以通过`ResourceBundle`类...

    java 获取系统时间错误,少了8小时

    这通常与Java中的时区设置和夏令时(Daylight Saving Time, DST)处理有关。 Java的`Date`类在默认情况下会按照本地时区(Local Time Zone)展示日期和时间。如果开发者期望获取的是协调世界时间(UTC),但程序却...

    java 时区转换工具包

    1. 获取时区时间 public static ZonedDateTime getNow(int offset) 2. 解析指定时间 public static ZonedDateTime parse(String date,String dateFormat,int offset) 3. 获取某一天的零点 public static ...

    Java业务开发常见错误.zip

    List是Java中最常用的集合类型,但其操作不当可能导致意外的元素丢失、重复或顺序混乱。文档可能详细解释了常见的错误用法,如并发修改异常、未初始化的列表引用、遍历时修改列表等,并提供了最佳实践。 "加餐1丨带...

    java时区转换的理解及示例详解

    Java中的时区可以通过TimeZone类来进行操作,例如: TimeZone timeZone = TimeZone.getTimeZone("PST"); Calendar calendar = new GregorianCalendar(); calendar.set(Calendar.MILLISECOND, 0); calendar.set...

    Windows2008上运行java产生8小时时差问题原因

    这可以通过在 Java 的配置文件中添加时区设置来实现。例如,在 Java 的配置文件中添加以下内容: `java.locale.providers=JRE,COMPAT` `java.locale.country=CN` `java.locale.language=zh` `java.timezone=GMT+8` ...

    Java对世界不同时区timezone之间时间转换的处理方法

    下面将对Java中关于时区的概念、时区之间的时间转换方法、Java中关于时间处理的类进行详细的介绍。 一、关于时区的一些概念 时区(timezone)是指由于世界各国家与地区经度不同,地方时也有所不同,按照经度将全球...

    服务器时区错误1

    5. **应用程序配置**:除了数据库层面,应用服务器也可能需要配置时区,比如Java应用中的`java.util.TimeZone.setDefault()`方法。 总之,处理服务器时区错误需要对数据库配置、JDBC连接参数以及时间区域概念有深入...

    详解Java中的时区类TimeZone的用法

    总的来说,`TimeZone` 类在Java中提供了处理日期和时间时区转换的灵活性。理解和熟练使用 `TimeZone` 是构建全球化应用的关键部分。在开发过程中,应始终考虑用户可能位于不同的时区,以及他们可能受到的夏令时影响...

    Java完成UTC与BJT时区的转换

    Java初学者练习题,使用if else循环完成,可对初学者提供一定的参考。

    基于java时区转换夏令时的问题及解决方法

    在Java中进行时区转换时,需要了解夏令时的概念和时区的表示方法。夏令时是指在夏天的时候,将时钟拨快一个小时,以提早日光的使用。目前有110多个国家采用夏令时。 首先,需要了解标准时区的表示方法。标准时区...

    Java中如何使用日期对象

    本文将详细解析如何在Java中有效地使用日期对象,包括创建日期实例、格式化日期、解析字符串为日期以及处理不同时区的问题。 ### 创建日期实例 Java中的`java.util.Date`类提供了创建日期对象的基本功能。可以通过...

    关于Java中的mysql时区问题详解

    "Java 中的 MySQL 时区问题详解" Java 中的 MySQL 时区问题是一种常见的问题,尤其是在分布式系统中,对时区的处理尤为重要。本文将详细介绍 Java 中的 MySQL 时区问题,并通过示例代码进行讲解。 一、时区问题的...

    Java连接数据库小错误QAQ

    然而,开发者在实际操作过程中经常会遇到各种问题,如本文标题所示的“Java连接数据库小错误QAQ”。本文将深入解析描述中提到的问题及其解决方案,帮助你理解和避免类似的问题。 首先,我们要知道Java连接MySQL通常...

Global site tag (gtag.js) - Google Analytics