java 時區
阿新 • • 發佈:2019-02-04
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);
}