JavaScript 腳本將當(dāng)?shù)貢r(shí)間轉(zhuǎn)換成其它時(shí)區(qū)
更新時(shí)間:2009年03月19日 13:20:50 作者:
毫無疑問,用JavaScript腳本可以通過直接查看用戶的時(shí)鐘,方便地在網(wǎng)頁上顯示本地時(shí)間。
但是,如果你想顯示不同地區(qū)的時(shí)間—--例如,如果你的本部在別的國家,你想查看“本國”時(shí)間而非當(dāng)?shù)貢r(shí)間,又該怎么辦呢?
要做到這一點(diǎn),必須進(jìn)行各種時(shí)間計(jì)算才能將當(dāng)?shù)貢r(shí)間轉(zhuǎn)換為目的時(shí)間。本文將解釋如何進(jìn)行這些計(jì)算。
第一步:
事情的第一步是獲得當(dāng)?shù)貢r(shí)間。在JavaScript中,這無疑可以通過初始化一個(gè)Data()對(duì)象來輕松完成。
// create Date object for current location
d = new Date();
通過調(diào)用Data()對(duì)象的getTime()方法,即可顯示1970年1月1日后到此當(dāng)時(shí)時(shí)間之間的毫秒數(shù)。
// convert to msec since Jan 1 1970
localTime = d.getTime();
第二步:
下一步,通過Data()對(duì)象的getTimezoneOffset()方法來找出當(dāng)?shù)貢r(shí)間偏移值。在缺省情況下,此方法以分鐘顯示時(shí)區(qū)偏移值結(jié)果,因此在早先的計(jì)算中要將此值轉(zhuǎn)換成毫秒。
// obtain local UTC offset and convert to msec
localOffset = d.getTimezoneOffset() * 60000;
注意,getTimezoneOffset()方法的負(fù)返回值表示當(dāng)?shù)貢r(shí)間在全球標(biāo)準(zhǔn)時(shí)間(UTC)之前,而正返回值則表示當(dāng)?shù)貢r(shí)間在全球標(biāo)準(zhǔn)時(shí)間(UTC)之后。
注意:萬一你想知道我是如何得到60000這個(gè)倍增因數(shù)的,記住1000毫秒等于一秒,而一分鐘等于60秒。因此 ,將分鐘轉(zhuǎn)換成毫秒,要用60乘以1000等于60000。
第三步
將本地時(shí)間與本地時(shí)區(qū)偏移值相加得到當(dāng)前國際標(biāo)準(zhǔn)時(shí)間(UTC)。
// obtain UTC time in msec
utc = localTime + localOffset;
這里,變量utc包含當(dāng)前國際標(biāo)準(zhǔn)時(shí)間(UTC)。但是,此時(shí)間以1970年1月1日到現(xiàn)在所含有的毫秒數(shù)來表示。暫時(shí)讓它這樣表示,因?yàn)檫€要進(jìn)行一些計(jì)算。
第四步
得到國際標(biāo)準(zhǔn)時(shí)間(UTC)后,再獲得目標(biāo)城市的國際標(biāo)準(zhǔn)時(shí)間(UTC)小時(shí)偏移值,把它轉(zhuǎn)換成毫秒,再加上國際標(biāo)準(zhǔn)時(shí)間(UTC)。
// obtain and add destination's UTC time offset
// for example, Bombay
// which is UTC + 5.5 hours
offset = 5.5;
bombay = utc + (3600000*offset);
注意:萬一你想知道我是如何得到3600000這個(gè)倍增因數(shù)的,記住1000毫秒等于一秒,而一小時(shí)等于3600秒。因此 ,將小時(shí)轉(zhuǎn)換成毫秒,要用3600乘以1000等于3600000。
此時(shí),變量bombay包含印度孟買城的當(dāng)?shù)貢r(shí)間。此當(dāng)?shù)貢r(shí)間以1970年1月1日到現(xiàn)在所含有的毫秒數(shù)來表示。顯然,這不是很合理,因此我們還要進(jìn)行一些計(jì)算。
第五步
通過初始化一個(gè)新的Data()對(duì)象,并調(diào)用此對(duì)象的toLocalString()方法,我們將前一步中計(jì)算得到的時(shí)間值轉(zhuǎn)換成一個(gè)大家可以看得懂的日期/時(shí)間字符串。
// convert msec value to date string
nd = new Date(bombay);
document.writeln("Bombay time is " + nd.toLocaleString() + "<br>");
這樣轉(zhuǎn)換就完成了!
總結(jié)
理解上面的步驟后,我們再看一看這段腳本(列表A),它建立一個(gè)緊湊,自定義的函數(shù)calcTime()來執(zhí)行所有的計(jì)算并返回一個(gè)時(shí)間值。
列表A
<html>
<head>
<script language="JavaScript">
// function to calculate local time
// in a different city
// given the city's UTC offset
function calcTime(city, offset) {
// create Date object for current location
d = new Date();
// convert to msec
// add local time zone offset
// get UTC time in msec
utc = d.getTime() + (d.getTimezoneOffset() * 60000);
// create new Date object for different city
// using supplied offset
nd = new Date(utc + (3600000*offset));
// return time as a string
return "The local time in " + city + " is " + nd.toLocaleString();
}
// get Bombay time
alert(calcTime('Bombay', '+5.5'));
// get Singapore time
alert(calcTime('Singapore', '+8'));
// get London time
alert(calcTime('London', '+1'));
</script>
</head>
<body>
</body>
</html>
這里,函數(shù)calcTime()接受一個(gè)城市名及它的國際標(biāo)準(zhǔn)時(shí)間(UTC)偏移值(按小時(shí)計(jì))。然后內(nèi)部執(zhí)行所有上面描述的計(jì)算,并返回一個(gè)包含此城市當(dāng)?shù)貢r(shí)間的字符串。
以下是列表A輸出內(nèi)容的一些樣本。
孟買當(dāng)?shù)貢r(shí)間為2005年8月1日,星期一下午4時(shí)43分51秒
新加坡當(dāng)?shù)貢r(shí)間為2005年8月1日,星期一下午7時(shí)13分51秒
倫敦當(dāng)?shù)貢r(shí)間為2005年8月1日,星期一下午12時(shí)13分51秒
要做到這一點(diǎn),必須進(jìn)行各種時(shí)間計(jì)算才能將當(dāng)?shù)貢r(shí)間轉(zhuǎn)換為目的時(shí)間。本文將解釋如何進(jìn)行這些計(jì)算。
第一步:
事情的第一步是獲得當(dāng)?shù)貢r(shí)間。在JavaScript中,這無疑可以通過初始化一個(gè)Data()對(duì)象來輕松完成。
// create Date object for current location
d = new Date();
通過調(diào)用Data()對(duì)象的getTime()方法,即可顯示1970年1月1日后到此當(dāng)時(shí)時(shí)間之間的毫秒數(shù)。
// convert to msec since Jan 1 1970
localTime = d.getTime();
第二步:
下一步,通過Data()對(duì)象的getTimezoneOffset()方法來找出當(dāng)?shù)貢r(shí)間偏移值。在缺省情況下,此方法以分鐘顯示時(shí)區(qū)偏移值結(jié)果,因此在早先的計(jì)算中要將此值轉(zhuǎn)換成毫秒。
// obtain local UTC offset and convert to msec
localOffset = d.getTimezoneOffset() * 60000;
注意,getTimezoneOffset()方法的負(fù)返回值表示當(dāng)?shù)貢r(shí)間在全球標(biāo)準(zhǔn)時(shí)間(UTC)之前,而正返回值則表示當(dāng)?shù)貢r(shí)間在全球標(biāo)準(zhǔn)時(shí)間(UTC)之后。
注意:萬一你想知道我是如何得到60000這個(gè)倍增因數(shù)的,記住1000毫秒等于一秒,而一分鐘等于60秒。因此 ,將分鐘轉(zhuǎn)換成毫秒,要用60乘以1000等于60000。
第三步
將本地時(shí)間與本地時(shí)區(qū)偏移值相加得到當(dāng)前國際標(biāo)準(zhǔn)時(shí)間(UTC)。
// obtain UTC time in msec
utc = localTime + localOffset;
這里,變量utc包含當(dāng)前國際標(biāo)準(zhǔn)時(shí)間(UTC)。但是,此時(shí)間以1970年1月1日到現(xiàn)在所含有的毫秒數(shù)來表示。暫時(shí)讓它這樣表示,因?yàn)檫€要進(jìn)行一些計(jì)算。
第四步
得到國際標(biāo)準(zhǔn)時(shí)間(UTC)后,再獲得目標(biāo)城市的國際標(biāo)準(zhǔn)時(shí)間(UTC)小時(shí)偏移值,把它轉(zhuǎn)換成毫秒,再加上國際標(biāo)準(zhǔn)時(shí)間(UTC)。
// obtain and add destination's UTC time offset
// for example, Bombay
// which is UTC + 5.5 hours
offset = 5.5;
bombay = utc + (3600000*offset);
注意:萬一你想知道我是如何得到3600000這個(gè)倍增因數(shù)的,記住1000毫秒等于一秒,而一小時(shí)等于3600秒。因此 ,將小時(shí)轉(zhuǎn)換成毫秒,要用3600乘以1000等于3600000。
此時(shí),變量bombay包含印度孟買城的當(dāng)?shù)貢r(shí)間。此當(dāng)?shù)貢r(shí)間以1970年1月1日到現(xiàn)在所含有的毫秒數(shù)來表示。顯然,這不是很合理,因此我們還要進(jìn)行一些計(jì)算。
第五步
通過初始化一個(gè)新的Data()對(duì)象,并調(diào)用此對(duì)象的toLocalString()方法,我們將前一步中計(jì)算得到的時(shí)間值轉(zhuǎn)換成一個(gè)大家可以看得懂的日期/時(shí)間字符串。
// convert msec value to date string
nd = new Date(bombay);
document.writeln("Bombay time is " + nd.toLocaleString() + "<br>");
這樣轉(zhuǎn)換就完成了!
總結(jié)
理解上面的步驟后,我們再看一看這段腳本(列表A),它建立一個(gè)緊湊,自定義的函數(shù)calcTime()來執(zhí)行所有的計(jì)算并返回一個(gè)時(shí)間值。
列表A
<html>
<head>
<script language="JavaScript">
// function to calculate local time
// in a different city
// given the city's UTC offset
function calcTime(city, offset) {
// create Date object for current location
d = new Date();
// convert to msec
// add local time zone offset
// get UTC time in msec
utc = d.getTime() + (d.getTimezoneOffset() * 60000);
// create new Date object for different city
// using supplied offset
nd = new Date(utc + (3600000*offset));
// return time as a string
return "The local time in " + city + " is " + nd.toLocaleString();
}
// get Bombay time
alert(calcTime('Bombay', '+5.5'));
// get Singapore time
alert(calcTime('Singapore', '+8'));
// get London time
alert(calcTime('London', '+1'));
</script>
</head>
<body>
</body>
</html>
這里,函數(shù)calcTime()接受一個(gè)城市名及它的國際標(biāo)準(zhǔn)時(shí)間(UTC)偏移值(按小時(shí)計(jì))。然后內(nèi)部執(zhí)行所有上面描述的計(jì)算,并返回一個(gè)包含此城市當(dāng)?shù)貢r(shí)間的字符串。
以下是列表A輸出內(nèi)容的一些樣本。
孟買當(dāng)?shù)貢r(shí)間為2005年8月1日,星期一下午4時(shí)43分51秒
新加坡當(dāng)?shù)貢r(shí)間為2005年8月1日,星期一下午7時(shí)13分51秒
倫敦當(dāng)?shù)貢r(shí)間為2005年8月1日,星期一下午12時(shí)13分51秒
您可能感興趣的文章:
- js時(shí)間戳與日期格式之間相互轉(zhuǎn)換
- javascript時(shí)間戳和日期字符串相互轉(zhuǎn)換代碼(超簡單)
- js 時(shí)間格式與時(shí)間戳的相互轉(zhuǎn)換示例代碼
- js中的時(shí)間轉(zhuǎn)換—毫秒轉(zhuǎn)換成日期時(shí)間的示例代碼
- 詳解JavaScript UTC時(shí)間轉(zhuǎn)換方法
- JS將時(shí)間秒轉(zhuǎn)換成天小時(shí)分鐘秒的字符串
- JS獲取時(shí)間的相關(guān)函數(shù)及時(shí)間戳與時(shí)間日期之間的轉(zhuǎn)換
- Vue.js 時(shí)間轉(zhuǎn)換代碼及時(shí)間戳轉(zhuǎn)時(shí)間字符串
- js獲取時(shí)間并實(shí)現(xiàn)字符串和時(shí)間戳之間的轉(zhuǎn)換
- 關(guān)于導(dǎo)入excel時(shí)js轉(zhuǎn)換時(shí)間的正確方式
相關(guān)文章
js 判斷所選時(shí)間(或者當(dāng)前時(shí)間)是否在某一時(shí)間段的實(shí)現(xiàn)代碼
這篇文章主要介紹了js 判斷所選時(shí)間(或者當(dāng)前時(shí)間)是否在某一時(shí)間段,需要的朋友可以參考下2015-09-09不錯(cuò)的一個(gè)日期輸入 動(dòng)態(tài)
[紅色]不錯(cuò)的一個(gè)日期輸入 動(dòng)態(tài)...2006-11-11顯示服務(wù)器時(shí)間的在線時(shí)鐘代碼簡單
不知道這里之前有沒有這種代碼。在網(wǎng)上找了半天也沒有滿意的,于是寫了這段代碼。實(shí)現(xiàn)起來很簡單,不必重復(fù)讀服務(wù)器時(shí)間,讀一次即可。2008-05-05javascript 時(shí)間對(duì)象的練習(xí)
javascript時(shí)間對(duì)象 時(shí)間對(duì)象是JS的內(nèi)置對(duì)象,使用前必須申明,包含日期和時(shí)間兩類.2008-12-12用js實(shí)現(xiàn)頁面顯示當(dāng)前日期和時(shí)間的代碼
js時(shí)間日期顯示效果代碼2008-04-04JavaScript 模仿vbs中的 DateAdd() 函數(shù)的代碼
JavaScript 模仿vbs中的 DateAdd() 函數(shù)的代碼...2007-08-08