美國時間轉中國時間,相容夏令時
阿新 • • 發佈:2019-02-14
/**
* 美國時間轉中國時間
* @param date
* @param oldZone
* @param newZone
* @return
*/
public static Date changeTimeZone(Date date, TimeZone oldZone, TimeZone newZone) {
//轉換為當時的美國時值
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(oldZone);
date = strToDate(simpleDateFormat.format(date));
//轉換為當時的中國時區的值
simpleDateFormat.setTimeZone(newZone);
date = strToDate(simpleDateFormat.format(date));
return date;
}
public static Date strToDate(String str){
Calendar calendar = Calendar.getInstance();
int year = Integer.parseInt(str.substring(0, 4));
int month = Integer.parseInt(str.substring(5, 7));
int day = Integer.parseInt(str.substring(8, 10));
int hour = Integer.parseInt(str.substring(11, 13));
int minute = Integer.parseInt(str.substring(14, 16));
int second = Integer.parseInt(str.substring(17, 19));
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
calendar.set(Calendar.DAY_OF_MONTH, day);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
return calendar.getTime();
}
關鍵原理:
時間和日曆是兩個不同的概念。
Date代表的是一個絕對時間,也就是說,不管你在哪個時區,Date都是一樣的,都是從1970年1月1日0點0分GMT時間起,到目前這一刻的毫秒數。所以,你第一段程式碼和第二段程式碼裡面,得到的date物件所代表的時間其實是一樣的。
而日曆是人們對絕對時間的一種描述方法,例如某年某月某日幾時幾分幾秒,這,隨著你當前所處的時區和地區而不同。
你在觀察date物件的時候,你肯定沒有去看它的毫秒數,而是先把毫秒數轉換成一個日曆。你沒有寫出你是怎麼把date轉換成日曆的,但假如你是用預設的Date.toString()的話,那麼,這是根據當前的預設時區來把毫秒數轉換成日曆的。因此,你在第一段程式碼裡沒有修改預設時區,得到的還是美國時間。而在第二段程式碼裡,因為修改了預設時區,所以雖然絕對時間沒有變化,但是你轉換得到的日曆不一樣了。
其實,如果你是要獲取當前時間,那麼直接用new Date()就可以了,跟你先建立一個Calendar物件,再指定一個時區後獲取的date是完全一樣的。只有在你需要把一個date用日曆來表示的時候,才需要用到Calendar和TimeZone。
一些總結:
calendar.setTimeZone():你在calendar物件裡面set的日期(日曆)是對於哪個時區來說的 calendar.getTime():你說說的這個日期(日曆),從1970(標準時區的這個日期)到現在過了多少秒 simpleDateFormat.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); simpleDateFormat.format(date):按照時區,來對時間戳進行日期(日曆)格式化