詳解JavaScript UTC時(shí)間轉(zhuǎn)換方法
一、前言
1、UTC: Universal Time Coordinated,協(xié)調(diào)世界時(shí)。
2、格林尼治標(biāo)準(zhǔn)時(shí)(GMT)
格林尼治標(biāo)準(zhǔn)時(shí)間(Greenwich Mean Time,GMT)是指位于倫敦郊區(qū)的皇家格林尼治天文臺(tái)的標(biāo)準(zhǔn)時(shí)間,因?yàn)楸境踝游缇€被定義在通過那里的經(jīng)線。 理論上來說,格林尼治標(biāo)準(zhǔn)時(shí)間的正午是指當(dāng)太陽(yáng)橫穿格林尼治子午線時(shí)的時(shí)間。由于地球在它的橢圓軌道里的運(yùn)動(dòng)速度不均勻,這個(gè)時(shí)刻可能和實(shí)際的太陽(yáng)時(shí)相差16分鐘。 地球每天的自轉(zhuǎn)是有些不規(guī)則的,而且正在緩慢減速。所以,格林尼治時(shí)間已經(jīng)不再被作為標(biāo)準(zhǔn)時(shí)間使用?,F(xiàn)在的標(biāo)準(zhǔn)時(shí)間——協(xié)調(diào)世界時(shí)(UTC)——由原子鐘提供。 自1924年2月5日開始,格林尼治天文臺(tái)每隔一小時(shí)會(huì)向全世界發(fā)放調(diào)時(shí)信息。而UTC是基于標(biāo)準(zhǔn)的GMT提供的準(zhǔn)確時(shí)間。
GMT(Greenwich Mean Time)——格林尼治標(biāo)準(zhǔn)時(shí)間,格林尼治標(biāo)準(zhǔn)時(shí)間是19 世紀(jì)中葉大英帝國(guó)的基準(zhǔn)時(shí)間,同時(shí)也是事實(shí)上的世界基準(zhǔn)時(shí)間。當(dāng)時(shí)主要為了1840 年之后的鐵路系統(tǒng)服務(wù)。它以格林尼治天文臺(tái)的經(jīng)線為0 度經(jīng)線,將世界分為24 個(gè)時(shí)區(qū),除了在特定時(shí)期受到仇外心理、民族主義和某些反英心緒的影響之外,它的地位一直未曾動(dòng)搖。
GMT和UTC的區(qū)別
GMT 手表就是可以顯示兩個(gè)或兩個(gè)以上時(shí)區(qū)時(shí)間的手表。無論用什么方式,顯示多個(gè)時(shí)區(qū)最直接的方法就是在一個(gè)表殼里裝多枚機(jī)芯。不過最經(jīng)濟(jì)也最常見的方法還是附加一個(gè)帶有12 小時(shí)或24 小時(shí)時(shí)標(biāo)刻度的旋轉(zhuǎn)表圈。旋轉(zhuǎn)表圈的使用方法很簡(jiǎn)單,將表圈上對(duì)應(yīng)第二時(shí)區(qū)時(shí)間的數(shù)字對(duì)齊表盤的時(shí)針即可,如果表盤時(shí)間是倫敦時(shí)間,那么將表圈順時(shí)針轉(zhuǎn)動(dòng)一小時(shí),指示的就是歐洲大陸時(shí)間,逆時(shí)針轉(zhuǎn)動(dòng)八小時(shí),則是美國(guó)西海岸時(shí)間。
將表盤時(shí)間設(shè)定為家鄉(xiāng)時(shí)間還是目的地時(shí)間取決于使用者的偏好,但由于12 小時(shí)手表無法辨別白天晚上,通常還是設(shè)定所在地時(shí)間比較合理。有一個(gè)事件的發(fā)生使得GMT 的定義復(fù)雜化了:1972 年1 月1日,UTC(協(xié)調(diào)世界時(shí))成為新的世界標(biāo)準(zhǔn)時(shí)間。
為了方便, 通常記成Universal Time Coordinated。同樣為了方便,在不需要精確到秒的情況下,通常也將GMT 和UTC 視作等同。盡管UTC 更加科學(xué)更加精確,但是對(duì)于手表玩家和收藏者來說,GMT 仍是更加受歡迎的。有不少人認(rèn)為,UTC 是巴黎圖謀世界計(jì)時(shí)中心地位的一種手段。事實(shí)上,它是以原子時(shí)為基礎(chǔ),在時(shí)刻上盡量接近世界時(shí)的一種時(shí)間計(jì)量系統(tǒng)。它的出現(xiàn)是現(xiàn)代社會(huì)對(duì)于精確計(jì)時(shí)的需要。
原子時(shí)與以往的計(jì)時(shí)系統(tǒng)不同,它非常精確并且不以某地的平均太陽(yáng)時(shí)為基準(zhǔn),但是遇有地球自轉(zhuǎn)速度不均勻,原子時(shí)與世界時(shí)之間的時(shí)差便日積月累,因 此,UTC 會(huì)在一段時(shí)期后加上正或負(fù)的閏秒來補(bǔ)償。因此協(xié)調(diào)世界時(shí)與國(guó)際原子時(shí)(TAI) 之間會(huì)出現(xiàn)若干整數(shù)秒的差別。位于巴黎的國(guó)際地球自轉(zhuǎn)事務(wù)中央局(IERS) 負(fù)責(zé)決定何時(shí)加入閏秒。
北京時(shí)間與格林尼治時(shí)間或UTC時(shí)間相差8個(gè)時(shí)區(qū),北京、上海、重慶位于東8區(qū),所以北京時(shí)間2013-1-1 0:00:00,轉(zhuǎn)換為UTC時(shí)間為:Tue Jan 1 00:00:00 UTC+0800 2013,時(shí)間過了8小時(shí)。
二、本地時(shí)間到UTC時(shí)間的轉(zhuǎn)換
當(dāng)?shù)貢r(shí)間到UTC時(shí)間的轉(zhuǎn)換,步驟如下:
1、將字符串日期轉(zhuǎn)換為日期數(shù)據(jù)類型
如果已經(jīng)是日期類型,可以省去此步驟。
可利用下面示例中的函數(shù)進(jìn)行轉(zhuǎn)換。
2、獲取UTC日期數(shù)據(jù)
包括年月日,時(shí)分秒,使用getUTC***()方法獲取。
獲取年:var y = date.getUTCFullYear();
獲取月: var m = date.getUTCMonth() ;
獲取日: var d = date.getUTCDate();
獲取小時(shí):var h= date.getUTCHours();
獲取分鐘:var M = date.getUTCMinutes();
獲取秒鐘:var s = date.getUTCSeconds();
這里date為日期類型數(shù)據(jù)。
注意:這里使用沒有UTC的方法是有問題(例如:date.getFullYear,date.getMonth),在進(jìn)行下一步轉(zhuǎn)換時(shí),會(huì)出現(xiàn)結(jié)果錯(cuò)誤。
3、使用Date.UTC()函數(shù)進(jìn)行轉(zhuǎn)換
將第2步中獲取的日期數(shù)據(jù)轉(zhuǎn)換為UTC時(shí)間(實(shí)際上為自1700年以來的毫秒數(shù))
var utc = Date.UTC(y,m,d,h,M,s);
這里,y、m、d、h、M、s分別代表步驟2中獲取的年、月、日、時(shí)、分、秒數(shù)值。
三、UTC日期到本地日期的轉(zhuǎn)換
UTC日期到本地日期轉(zhuǎn)換則要簡(jiǎn)單得多,先將UTC時(shí)間轉(zhuǎn)換為日期格式,然后再轉(zhuǎn)換為本地日期格式,例如:
var date2 = new Date(utc); var localeString = date2.toLocaleString();
或只要日期
var localeDateString = date2.toLocaleDateString();
或只要時(shí)間
var localeTimeString = date2.toLocaleTimeString();
實(shí)例:
//日期加減計(jì)算 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轉(zhuǎn)換 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());
測(cè)試結(jié)果:
--------------------------------------------- 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時(shí)間實(shí)際上是一串以自1970年以來的毫秒數(shù)表示的長(zhǎng)數(shù)字。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- js時(shí)間戳與日期格式之間相互轉(zhuǎn)換
- javascript時(shí)間戳和日期字符串相互轉(zhuǎn)換代碼(超簡(jiǎn)單)
- js 時(shí)間格式與時(shí)間戳的相互轉(zhuǎn)換示例代碼
- js中的時(shí)間轉(zhuǎn)換—毫秒轉(zhuǎn)換成日期時(shí)間的示例代碼
- JS將時(shí)間秒轉(zhuǎn)換成天小時(shí)分鐘秒的字符串
- JS獲取時(shí)間的相關(guān)函數(shù)及時(shí)間戳與時(shí)間日期之間的轉(zhuǎn)換
- Vue.js 時(shí)間轉(zhuǎn)換代碼及時(shí)間戳轉(zhuǎn)時(shí)間字符串
- JavaScript 腳本將當(dāng)?shù)貢r(shí)間轉(zhuǎn)換成其它時(shí)區(qū)
- js獲取時(shí)間并實(shí)現(xiàn)字符串和時(shí)間戳之間的轉(zhuǎn)換
- 關(guān)于導(dǎo)入excel時(shí)js轉(zhuǎn)換時(shí)間的正確方式
相關(guān)文章
javascript實(shí)現(xiàn)base64 md5 sha1 密碼加密
本篇文章給大家介紹了javascript實(shí)現(xiàn)密碼加密,通過base64、md5、sha1文件,調(diào)用相關(guān)方法實(shí)現(xiàn)密碼加密,非常簡(jiǎn)單,需要的朋友可以參考下2015-09-091秒50萬字!js實(shí)現(xiàn)關(guān)鍵詞匹配
1秒50萬字!js實(shí)現(xiàn)關(guān)鍵詞匹配,快速進(jìn)行關(guān)鍵字匹配,感興趣的小伙伴們可以參考一下2016-08-08js實(shí)現(xiàn)網(wǎng)站最上邊可關(guān)閉的浮動(dòng)廣告條代碼
這篇文章主要介紹了js實(shí)現(xiàn)網(wǎng)站最上邊可關(guān)閉的浮動(dòng)廣告條代碼,涉及javascript基于鼠標(biāo)事件操作頁(yè)面元素樣式的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-09-09javascript XML數(shù)據(jù)顯示為HTML一例
通過Javascript把xml轉(zhuǎn)換成html格式輸出一列2008-12-12js代碼運(yùn)行報(bào)錯(cuò)Warning:To?load?an?ES?module,?set?"type&q
最近在學(xué)習(xí)ES6的過程中,和運(yùn)行javascript文件時(shí)進(jìn)行了報(bào)錯(cuò),下面這篇文章主要給大家介紹了關(guān)于js代碼運(yùn)行報(bào)錯(cuò)Warning:To?load?an?ES?module,?set?"type":"module"in?the?package.json?or?use?the?.mjs的相關(guān)資料,需要的朋友可以參考下2023-04-04CKEditor 4.4.1 添加代碼高亮顯示插件功能教程【使用官方推薦Code Snippet插件】
這篇文章主要介紹了CKEditor 4.4.1 添加代碼高亮顯示插件功能,涉及ckeditor使用官方推薦Code Snippet插件的相關(guān)操作布局與使用注意事項(xiàng),需要的朋友可以參考下2019-06-06