1. 程式人生 > >java 時區

java 時區

1.最近在做系統時,突然發現瀏覽器時區與web伺服器時區可能存在不同,這樣就導致資料傳輸只能建立在UTC的基礎上,那麼應用伺服器和web伺服器也有可能不在同一個時區,所以資料庫資料存的也是UTC時間。

這就涉及要各種本地時間轉UTC時間,UTC時間轉本地時間的問題了。

在這裡必須說的一點就是,不管是伺服器間通訊,還是瀏覽器或者客戶端與伺服器間通訊,都採用傳參為utc時間+時區的方法,而且出於本人習慣,utc時間通常用字串,方便傳值,也因為字串是沒有任何時區瓜葛,是實實在在的。

2.想必大家都聽過太多次  Date中不包含時區的說法,但是當我們這樣寫,想將一個UTC字串轉換成對應的Date時:

   String dateStr = "2013-1-31 12:17:14";        //頁面傳進來的UTC時間
   SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
   try {  
       Date dateTmp = dateFormat.parse(dateStr);  
       System.out.println(dateTmp);  
   } catch (ParseException e) {  
       e.printStackTrace();  
   } 


卻發現打印出來是Thu Jan 31 12:17:14 CST 2013       和傳入的字串一致。   在我轉換成UTC時間時,居然,減少了8個小時。也就是說我的UTC時間跟傳進來的字串完全不一樣了。

趕緊百度查CST,確發現 CST可視為美國,澳大利亞或中國的標準時間   在這裡,也就是說是中國標準時間的意思,那麼所謂的不帶時區呢,沒想到你是這樣的Date!

嗯,經過各種亂查,發現其實dateFormat有設定時區的功能,如果在上述第二行程式碼下加入這句話:

dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
// dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 

獲取的Date再轉換成UTC時間,與傳進來的字串一致。

我理解上面這句程式碼的意思為:告訴別人我的字串是utc時間

那麼同理,想要把Date轉成對應的UTC字串,要這樣:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // 告訴別人我要的字串是utc時間
String str = sdf.format(date);

當然偶爾還有將UTC時間的字串轉換成瀏覽器/客戶端的字串的需求,這裡一併寫在下面。

/**
* 將utc的字串轉換成本地Date
*/
public static Date getUTCStrToLocalDate(String s) throws ParseException {
	SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
	sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // 告訴別人我的字串是utc時間
	return sdf.parse(s);
}
/**
* 將Date變成UTC字串
*/
public static String getUTCStrToLocalDate(Date d) throws ParseException {
	SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
	sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // 告訴別人我的字串是utc時間
	return sdf.format(d);
}


/**
* 將UTC字串變成瀏覽器端的相應時區的字串
*/
public static String getUTCStrToBrowserStr(String s, String timeZone)throws ParseException {
	SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
	sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // 告訴別人我的字串是utc時間
	Date date = sdf.parse(s);
	sdf.setTimeZone(TimeZone.getTimeZone(timeZone)); // 告訴別人我的字串是utc時間
	return sdf.format(date);
}