一住练、基本概念
1蝉娜、格林威治時間(GWT)
格林威治子午線上的地方時偿警,位于倫敦郊區(qū)的皇家格林尼治天文臺的標準時間刺桃,也叫世界時茶袒。比如我們中國是東八區(qū)吏颖,北京時間是(GMT+08:00)
2序芦、協(xié)調(diào)世界時間(UTC)
UTC是根據(jù)原子鐘來計算時間吞彤,現(xiàn)在世界上最精確的原子鐘50億年才會誤差1秒丁恭,可以說非常精確曹动。
3、北京時間(CST)
中國時間的標準牲览。
4墓陈、太平洋時間(PST)
是在美國、加拿大第献、墨西哥西海岸靠近太平洋的地區(qū)使用贡必,也被稱為太平洋時區(qū)。
相比較而言:個人理解 UTC 是標準時間參照庸毫,GMT(格林威治時間)仔拟、CST(北京時間)、PST(太平洋時間)等等是具體的時區(qū)飒赃。因為GMT是根據(jù)地球的自轉(zhuǎn)和公轉(zhuǎn)來計算時間利花,而地球的自轉(zhuǎn)正在緩速變慢,所以使用GMT的話载佳,總有一天炒事,打個比方,中午12點蔫慧,并不是一天太陽當頭照的時候挠乳,很可能就是早上或者晚上了。所以說UTC更加精確藕漱。
二欲侮、夏令時
是一種為節(jié)約能源而人為規(guī)定地方時間的制度。也叫夏時制肋联,夏時令(Daylight Saving Time:DST)威蕉,又稱“日光節(jié)約時制”和“夏令時間”,在這一制度實行期間所采用的統(tǒng)一時間稱為“夏令時間”橄仍。一般在天亮早的夏季人為將時間調(diào)快一小時韧涨,可以使人早起早睡牍戚,減少照明量,以充分利用光照資源虑粥,從而節(jié)約照明用電如孝。各個采納夏時制的國家具體規(guī)定不同。目前全世界有近110個國家每年要實行夏令時娩贷。
據(jù)稱最早有夏令時構(gòu)思的是本杰明·富蘭克林
三第晰、時區(qū)的處理:
服務器時間是東八區(qū)時間,前端頁面會在全世界各地時區(qū)彬祖。
為兼容世界各地時間茁瘦,需要:
- 1.服務器拉取的北京時間轉(zhuǎn)為本地時區(qū)的時間。
- 2.將用戶本地時間轉(zhuǎn)換為北京時間傳給服務器储笑。
公式:都轉(zhuǎn)換成零時區(qū)的時間(UTC時間)
其他時區(qū)時間 + 其他時區(qū)時差 = 本地時間 + 本地時差 = UTC時間 = GWT時間
JS & Javascript代碼:
/**
* 判斷是否為夏令時
* @param date
* @returns {boolean}
*/
function isSummerTime(date) {
const springTime = new Date(date.getFullYear(), 0, 1);
const summerTime = new Date(date.getFullYear(), 6, 1);
if (springTime.getTimezoneOffset()
=== summerTime.getTimezoneOffset()
=== date.getTimezoneOffset()) {
return false;
} else {
return true;
}
}
/**
* 北京時間轉(zhuǎn)本地時間
*/
function getLocalDate(east8date) {
const targetTimezone = -8;
const dif = new Date().getTimezoneOffset();
let localTime = east8date.getTime()
+ (targetTimezone * 60 * 60 * 1000) - dif * 60 * 1000;
localTime -= (isSummerTime(east8date) ? 60 * 60 * 1000 : 0);
return new Date(localTime);
}
/**
* 本地時間轉(zhuǎn)北京時間
*/
function getEast8Date(date) {
const targetTimezone = -8;
const dif = new Date().getTimezoneOffset();
let east8time = date.getTime() + dif * 60 * 1000
- (targetTimezone * 60 * 60 * 1000);
east8time += (isSummerTime(date) ? 60 * 60 * 1000 : 0);
return new Date(east8time);
}
Java代碼:
/**
* 系統(tǒng)時區(qū)時間轉(zhuǎn)成北京時區(qū)的時間發(fā)給云端
* 云端獲取的北京時區(qū)時間轉(zhuǎn)成系統(tǒng)時區(qū)的時間顯示
*/
public static Calendar timeZoneToCalendar(Calendar calendar,cboolean toBeijingOrLocal) {
int timeOffset;
if (toBeijingOrLocal) {
timeOffset = TimeZone.getDefault().getOffset(System.currentTimeMillis())
- TimeZone.getTimeZone("GMT+08").getRawOffset();
} else {
timeOffset = TimeZone.getTimeZone("GMT+08").getRawOffset()
- TimeZone.getDefault().getOffset(System.currentTimeMillis());
}
Calendar zoneCalendar = Calendar.getInstance();
long timeInMilis = calendar.getTimeInMillis() - timeOffset;
zoneCalendar.setTimeInMillis(timeInMilis);
return zoneCalendar;
}
四甜熔、夏令時實行國家:
1. 國內(nèi):
從1986年到1991年的六個年度,在全國范圍內(nèi)實行夏時制突倍,1992年起腔稀,夏令時暫停實行。
2.國際:
- 俄羅斯
2011-2014使用夏令時
- 美國
美國夏時制的實行與否羽历,完全由各州焊虏、各縣自行決定,不由聯(lián)邦政府統(tǒng)一規(guī)定窄陡。目前美國絕大部分地區(qū)實行夏令時炕淮。
- 歐盟國家
歐盟國家和瑞士都是從3月最后一個星期日到10月最后一個星期日實行夏令時。
- 加拿大
加拿大從3月第二個星期日到11月第一個星期日實行夏令時跳夭,不過薩斯喀徹溫省大部分地區(qū)不實行涂圆。
- 墨西哥
墨西哥從4月第一個星期日到10月最后一個星期日實行夏令時,不過在首都墨西哥城币叹,由于市長不同意總統(tǒng)實行夏令時的決定润歉,有的區(qū)服從總統(tǒng)實行夏令時,有的區(qū)則服從市長不實行夏令時颈抚。
- 新西蘭
新西蘭由于處于南半球踩衩,所以夏季和北半球相反。它從9月最后一個星期日到4月第一個星期天實行夏時贩汉。
- 澳大利亞
澳大利亞除北部地區(qū)驱富、昆士蘭州和西澳(佩斯、珀斯)之外全部實行夏令時匹舞。