1. 程式人生 > >java讀取系統時間寫入mysql資料庫時,滯後八小時問題的解決

java讀取系統時間寫入mysql資料庫時,滯後八小時問題的解決

 JAVA日期和時間類徹底解決(Translated by Willpower)(頭兩段姑且引用Willpower先生的譯文)

你是否在苦苦掙扎在JAVA語言中的日期和時間中?當你在計算機上顯示日期和時間時,, 是否要快一個小時?或者可能要早一個小時?,或者兩

個小時, 或者更嚴重? 當你試圖用JAVA寫日期和時間到一個檔案中,或者到你的資料庫中(通過Java DatabaseConnectivity (JDBC))— 錯誤

的時間被儲存了嗎? (實際上,我們中國處於東八區,所以在我們電腦上得到的日期應該是滯後八小時——當然,如果你的jre工作正常,那就

恭喜你,你不用往下看了。)

我曾經被這個問題困饒過很長時間。我不能解決為什麼JAVA改變了我給的時間戳(timestamps)。我從資料庫中檢索時間戳資料並顯示在我的

圖形使用者介面(GUI)中時, 總是會顯示一個不同的時間—和我期望的值要相差1,2或3個小時。我重新檢查了資料庫中的值,它是正常的。那麼

到底應該怎麼辦呢?

(好了,下面,我開始了)
我的jsp配置是:tomcat6.0 + jre1.5.0_08 + jdk1.5.0_08 (版本號太TMD長了,忽然聯想到這兩天一直拉肚子...:)...,
資料庫是:mysql

在將系統時間寫入資料庫的時候,用

java.sql.Timestamp nowTime=new java.sql.Timestamp(new java.util.Date().getTime());

得到時間,然後寫入資料庫,發現寫入的時間居然都滯後了八小時,也就是說,現在是2007-5-8 21:49:32,那麼資料庫中寫入的時間就

是:2007-5-8 13:49:32;這個問題困惑了我好久。曾經一度,我採用了“繞過去”的辦法來避開這個問題。解決的方法如下:

在建立資料庫的時候,直接

CREATE TABLE `tableName` (
  `id` int(12) NOT NULL auto_increment,
  `uu` timestamp default now(), ----here?attention?
)

也就是說,直接設定資料庫為timestamp,然後讓資料庫自動獲取系統時間;
在javabean或servlet的時候,pstmt.setTimestamp(2,null);就是插入null,這樣資料庫裡面的資料就是當前的時間。

不過,這個事情困擾我這麼久,總是不甘心,眾裡尋他千百度,終於發現了兩篇猛文:

經過研究發現,其實這是JVM的預設TimeZone類有問題引起的,算了算了,具體原因不作分析了。老婆等著我的電話。解決辦法如下:

/*ForTest.java*/
import java.util.TimeZone;
import java.util.Date;
import java.text.DateFormat;

public class ForTest {

public static void main(String[] args) {
 
DateFormat dateFormatterChina = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);//格式化輸出
TimeZone timeZoneChina = TimeZone.getTimeZone("Asia/Shanghai");//獲取時區
dateFormatterChina.setTimeZone(timeZoneChina);//設定系統時區
Date curDate = new Date();//獲取系統時間

System.out.println(dateFormatterChina.format(curDate));
}
}

走了走了,要捱罵了。阿彌佗佛。。。