詳解JavaScript UTC時間轉換方法

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

一、前言
1、UTC: Universal Time Coordinated,協調世界時。
2、格林尼治標準時(GMT)
    格林尼治標準時間(Greenwich Mean Time,GMT)是指位於倫敦郊區的皇家格林尼治天文臺的標準時間,因為本初子午線被定義在通過那裡的經線。 理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時的時間。由於地球在它的橢圓軌道里的運動速度不均勻,這個時刻可能和實際的太陽時相差16分鐘。 地球每天的自轉是有些不規則的,而且正在緩慢減速。所以,格林尼治時間已經不再被作為標準時間使用。現在的標準時間——協調世界時(UTC)——由原子鐘提供。 自1924年2月5日開始,格林尼治天文臺每隔一小時會向全世界發放調時資訊。而UTC是基於標準的GMT提供的準確時間。
    GMT(Greenwich Mean Time)——格林尼治標準時間,格林尼治標準時間是19 世紀中葉大英帝國的基準時間,同時也是事實上的世界基準時間。當時主要為了1840 年之後的鐵路系統服務。它以格林尼治天文臺的經線為0 度經線,將世界分為24 個時區,除了在特定時期受到仇外心理、民族主義和某些反英心緒的影響之外,它的地位一直未曾動搖。

GMT和UTC的區別
    GMT 手錶就是可以顯示兩個或兩個以上時區時間的手錶。無論用什麼方式,顯示多個時區最直接的方法就是在一個錶殼裡裝多枚機芯。不過最經濟也最常見的方法還是附加一個帶有12 小時或24 小時時標刻度的旋轉表圈。旋轉表圈的使用方法很簡單,將表圈上對應第二時區時間的數字對齊錶盤的時針即可,如果錶盤時間是倫敦時間,那麼將表圈順時針轉動一小時,指示的就是歐洲大陸時間,逆時針轉動八小時,則是美國西海岸時間。
    將錶盤時間設定為家鄉時間還是目的地時間取決於使用者的偏好,但由於12 小時手錶無法辨別白天晚上,通常還是設定所在地時間比較合理。有一個事件的發生使得GMT 的定義複雜化了:1972 年1 月1日,UTC(協調世界時)成為新的世界標準時間。
    為了方便, 通常記成Universal Time Coordinated。同樣為了方便,在不需要精確到秒的情況下,通常也將GMT 和UTC 視作等同。儘管UTC 更加科學更加精確,但是對於手錶玩家和收藏者來說,GMT 仍是更加受歡迎的。有不少人認為,UTC 是巴黎圖謀世界計時中心地位的一種手段。事實上,它是以原子時為基礎,在時刻上儘量接近世界時的一種時間計量系統。它的出現是現代社會對於精確計時的需要。
    原子時與以往的計時系統不同,它非常精確並且不以某地的平均太陽時為基準,但是遇有地球自轉速度不均勻,原子時與世界時之間的時差便日積月累,因 此,UTC 會在一段時期後加上正或負的閏秒來補償。因此協調世界時與國際原子時(TAI) 之間會出現若干整數秒的差別。位於巴黎的國際地球自轉事務中央局(IERS) 負責決定何時加入閏秒。

    北京時間與格林尼治時間或UTC時間相差8個時區,北京、上海、重慶位於東8區,所以北京時間2013-1-1 0:00:00,轉換為UTC時間為:Tue Jan 1 00:00:00 UTC 0800 2013,時間過了8小時。
二、本地時間到UTC時間的轉換
  當地時間到UTC時間的轉換,步驟如下:

1、將字串日期轉換為日期資料型別
如果已經是日期型別,可以省去此步驟。

可利用下面示例中的函式進行轉換。
2、獲取UTC日期資料
包括年月日,時分秒,使用getUTC***()方法獲取。

獲取年:var y =  date.getUTCFullYear();   
獲取月: var m = date.getUTCMonth() ;
獲取日: var d = date.getUTCDate();
獲取小時:var h= date.getUTCHours();
獲取分鐘:var M = date.getUTCMinutes();
獲取秒鐘:var s = date.getUTCSeconds();

這裡date為日期型別資料。

注意:這裡使用沒有UTC的方法是有問題(例如:date.getFullYear,date.getMonth),在進行下一步轉換時,會出現結果錯誤。

3、使用Date.UTC()函式進行轉換
將第2步中獲取的日期資料轉換為UTC時間(實際上為自1700年以來的毫秒數)

var utc = Date.UTC(y,m,d,h,M,s);

這裡,y、m、d、h、M、s分別代表步驟2中獲取的年、月、日、時、分、秒數值。

三、UTC日期到本地日期的轉換
UTC日期到本地日期轉換則要簡單得多,先將UTC時間轉換為日期格式,然後再轉換為本地日期格式,例如:


var date2 = new Date(utc);
var localeString = date2.toLocaleString();

或只要日期


var localeDateString = date2.toLocaleDateString();

或只要時間


var localeTimeString = date2.toLocaleTimeString();

例項:


//日期加減計算 
function dateadd(sdate, delta, ymdh){ 
if(!sdate ) return; 
if(typeof sdate == 'object') sdate = sdate.toLocaleString(); 
/(\d{4})[\D](\d{1,2})[\D](\d{1,2})[\D]?\s(\d{1,2}):(\d{1,2}):(\d{1,2})/.exec(sdate); 
var a = [0,0,0,0]; 
switch(ymdh){ 
case 'y': 
a = [delta, -1, 0, 0]; 
break; 
case 'm': 
a=[0, delta-1, 0, 0]; 
break; 
case 'H': 
a=[0, -1, 0, delta]; 
break;  
default: 
a = [0, -1, delta, 0]; 
break;   
} 
println('date:'   (parseInt(RegExp.$1)  a[0])   '-'  (parseInt(RegExp.$2) a[1])  '-'   (parseInt(RegExp.$3) a[2]) 
' '   (parseInt(RegExp.$4) a[3])  ':'   RegExp.$5   ':'  RegExp.$6); 
return new Date(parseInt(RegExp.$1)  a[0], parseInt(RegExp.$2) a[1], parseInt(RegExp.$3) a[2], parseInt(RegExp.$4) a[3], RegExp.$5,RegExp.$6); 
} 
//UTC轉換 
println('---------------------------------------------'); 
var sdate='2013-01-01 00:00:00.0'; 
var d = dateadd(sdate,0); 
var d2 = Date.UTC(d.getUTCFullYear(),d.getUTCMonth() ,d.getUTCDate(),d.getUTCHours(),d.getUTCMinutes(),d.getUTCSeconds()); 
println('原日期:'   sdate); 
println('d2:'   d2); 
println('d3:'   new Date(d2)); 
println('d4:'   new Date(d2).toLocaleString()); 
println('d5:'   d2.toLocaleString()); 

測試結果:


---------------------------------------------
date:2013-0-1 0:00:00
原日期:2013-01-01 00:00:00.0
d2:1356969600000
d3:Tue Jan 1 00:00:00 UTC 0800 2013
d4:2013年1月1日 0:00:00
d5:1,356,969,600,000.00

可以看到UTC時間實際上是一串以自1970年以來的毫秒數表示的長數字。

以上就是本文的全部內容,希望對大家的學習有所幫助。

您可能感興趣的文章:

JavaScript將當前時間轉換成UTC標準時間的方法JavaScript 中的日期和時間及表示標準介紹js 時間格式與時間戳的相互轉換示例程式碼時間戳轉換為時間 年月日時間的JS函式javascript日期轉換 時間戳轉日期格式js時間日期和毫秒的相互轉換把時間戳轉換為日期格式的js程式碼js與C#進行時間戳轉換Javascript的時間戳和php的時間戳轉換注意事項javascript 日期時間 轉換的方法JS實現將Asp.Net的DateTime Json型別轉換為標準時間的方法

相關文章

前端開發 最新文章