Java时区bug,TimeZone.setDefault()只在当前线程有效
项目是基于GMT时间的,在系统启动的时候,我们就会调用TimeZone.setDefault(timeZone)将默认时区设为GMT。
后来突然发现,有时用户选择的时间经过后台一圈后回产生8个小时误差。又是间歇性的,要他重现的时候又偏不来。苦心debug,终于发现在部分线程中,时区还是GMT+8,后台某个调用可能把时区变为了GMT,8小时误差就产生了。网上一搜,原来是bug:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6352812
只在部分电脑上有问题,幸好production上是好的,写了一个程序来测试:
import java.util.Date;
import java.util.TimeZone;
public class Test {
@SuppressWarnings("unused")
public static void main(String[] args) throws InterruptedException {
DateThread thread = new DateThread();
thread.start();
TimeZone gmt = TimeZone.getTimeZone("GMT");
Date now = new Date();
System.out.println("main thread,before set timezone:" + now.toString());
TimeZone.setDefault(gmt);
Thread.currentThread().sleep(2000);
thread.resume();
System.out.println("main thread,after set timezone:" + now.toString());
}
}
class DateThread extends Thread {
@SuppressWarnings( { "unused", "deprecation" })
public void run() {
Date now = new Date();
System.out.println("sub thread,before set timezone:" + now.toString());
this.suspend();
System.out.println("sub thread,after set timezone:" + now.toString());
}
}
如果子线程输出的时区一样,就说明有bug
相关文档:
Struts、Hibernate和Spring的轻型J2EE架构的研究
关键词 Struts,Hibernate,Spring,用户管理
一、特性
1. Struts与MVC
Struts是Apache Jakarta项目的组成部分。该项目的目标是为建立Java Web 应用程序而提供的一个开源
框架。通过使用Struts框架可以改进和提高Java Server Pages (JSP ......
写一个Application程序,界面上放置两个Textfield,一个Button,用户在第一个Textfield中输入姓名后敲回车键可以在第二个Textfield中输出:“Welcome you,用姓名”。用户点击Button可以退出程序。
帮帮忙吧!简单的Java语言。谢谢啦! ......
需要做一个桌面的小东西,由于至今为止只会写Java,所以只有用swing来做了。朋友说Delphi做起来很快,但我没时间去学了,一定要开始横向发展了。
原来短暂的做过NetBeans的rcp开发,但它的代码组织有点过于复杂,不过我要做的不是很大的东西,但还是想先找Eclips ......
Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后
者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是
Object.equals方法了。但是,如果每增加一个元素 ......