溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用JavaScript和Google時(shí)區(qū)API顯示任何城市的本地時(shí)間

發(fā)布時(shí)間:2020-07-23 07:26:35 來源:網(wǎng)絡(luò) 閱讀:4294 作者:二哈少爺 欄目:開發(fā)技術(shù)

JavaScript沒有短缺Date()自從該對(duì)象在很多生命周期前就被引入以來,相關(guān)的冒險(xiǎn)就開始了,盡管它們?cè)诤艽蟪潭壬暇窒抻跈z索和操作用戶系統(tǒng)的本地時(shí)間。使用JavaScript獲取特定位置的日期和時(shí)間一直是一件難以捉摸的事情,因?yàn)?code>Date對(duì)象本身就對(duì)用戶計(jì)算機(jī)的時(shí)間進(jìn)行操作。當(dāng)有Date方法,例如Date.getTimezoneOffset()Date.getUTCDate()以幫助我們獲得世界時(shí)間,從這里開始,在復(fù)雜的國(guó)際時(shí)間規(guī)則世界中航行,比如在特定時(shí)區(qū)的夏令節(jié)約時(shí)間,然后我們才能可靠地到達(dá)彩虹的盡頭,也就是世界上某個(gè)特定地點(diǎn)的時(shí)間,這是一個(gè)滑坡路。我們需要的是一個(gè)時(shí)區(qū)數(shù)據(jù)庫(kù)和夏令節(jié)約時(shí)間規(guī)則,以消除僅依靠用戶的本地時(shí)間來獲得地球上特定位置的時(shí)間的所有復(fù)雜性和錯(cuò)誤性。那就是Google的時(shí)區(qū)API派上用場(chǎng):


洛杉磯時(shí)間:下午10:08:38 (Wed)

多倫多時(shí)間:上午1:08:38 (Thur)

AM

巴黎時(shí)間


設(shè)置Google時(shí)區(qū)API

Google的Timezone API提供一個(gè)簡(jiǎn)單的接口來獲取地球上任何位置的時(shí)區(qū)和DST(夏令時(shí))偏移量。要使用它,只需請(qǐng)求:

https://maps.googleapis.com/maps/api/timezone/json/?parameters

哪里“杰森“可以用字符串替換”XML“如果您希望返回的數(shù)據(jù)是XML格式,而不是JSON格式,那么parameters應(yīng)包括以下3條信息:

Google時(shí)區(qū)API調(diào)用的預(yù)期參數(shù):

  • location以逗號(hào)分隔的緯度和經(jīng)度元組(即:location=37.3711, -122.0375),表示要查找的確切位置。

  • timestamp:所需的日期和時(shí)間,以秒表示,從1970年1月1日午夜開始。API使用 timestamp確定是否應(yīng)用夏令節(jié)余。1970年以前的時(shí)間可以表示為負(fù)值。

  • key:應(yīng)用程序的API密鑰。這個(gè)免費(fèi)的密鑰是需要從您的網(wǎng)站向API提出請(qǐng)求。

我們將在下一節(jié)中詳細(xì)介紹如何定義前兩個(gè)參數(shù),盡管在此之前,您需要首先獲得一個(gè)GoogleAPI密鑰才能從您的站點(diǎn)訪問時(shí)區(qū)API。要做到這一點(diǎn),只需按照本頁。如果您已經(jīng)設(shè)置了一個(gè)API鍵,并且希望再次修改或撤回它,那么直接跳到Google控制臺(tái)頁面.

下面是一個(gè)完全正確的時(shí)區(qū)API調(diào)用字符串的示例加拿大溫哥華日期2016年11月4日:

https://maps.googleapis.com/maps/api/timezone/json?location=49.283436, -123.130429&timestamp=1478880000&key=YOUR_API_KEY

返回的數(shù)據(jù):

例如,調(diào)用完成后,通過Ajax返回的數(shù)據(jù)以JSON字符串的形式出現(xiàn):

1

2

3

4

5

6

7

{

   "dstOffset" : 3600,

   "rawOffset" : -28800,

   "status" : "OK",

   "timeZoneId" : "America/Vancouver",

   "timeZoneName" : "Pacific Daylight Time"

}

在加拿大溫哥華,2016年夏令時(shí)間將于3月13日至11月6日生效。由于所要求的日期2016年11月4日在這一范圍內(nèi),返回的數(shù)據(jù)反映了這一點(diǎn)。這,這個(gè),那,那個(gè)"dstOffset"參數(shù)(以秒為單位)告訴我們?cè)摃r(shí)間和位置,DST(夏令節(jié))偏移量相對(duì)于世界時(shí)是1小時(shí)(3600秒)?!?code>rawOffset“屬性告訴我們此時(shí)區(qū)相對(duì)于世界時(shí)的標(biāo)準(zhǔn)偏移量(以秒為單位),撇開從任何夏令節(jié)余中抵消。

簡(jiǎn)而言之,任何位置的本地時(shí)間都是通過添加timestamp“參數(shù)和返回的"dstOffset",和“rawOffset“共同的價(jià)值觀。但這只是一個(gè)太簡(jiǎn)單的解釋,所以讓我們繼續(xù)挖掘。

為地球上某一特定地點(diǎn)的當(dāng)前日期/時(shí)間準(zhǔn)備參數(shù)

讓我們把所有這些理論運(yùn)用到實(shí)際中去,得到世界上某一特定地點(diǎn)的當(dāng)前日期和時(shí)間。東京怎么樣?曾經(jīng)去過那里,愛過一切,除了昂貴的交通!我們需要東京的緯度和經(jīng)度坐標(biāo),加上當(dāng)前的世界日期和時(shí)間,從1970年1月1日午夜開始,世界協(xié)調(diào)時(shí)間為“timestamp“參數(shù)以構(gòu)造相應(yīng)的時(shí)區(qū)請(qǐng)求:

1

2

3

4

5

6

var loc = '35.731252, 139.730291' // Tokyo expressed as lat,lng tuple

var targetDate = new Date() // Current date/time of user computer

var timestamp = targetDate.getTime()/1000 + targetDate.getTimezoneOffset() * 60 // Current UTC date/time expressed as seconds since midnight, January 1, 1970 UTC

var apikey = 'YOUR_TIMEZONE_API_KEY_HERE'

 

var apicall = 'https://maps.googleapis.com/maps/api/timezone/json?location=' + loc + '&timestamp=' + timestamp + '&key=' + apikey

讓我們來看看我們是如何導(dǎo)出上述值的:

-獲取位置的緯度和經(jīng)度

要使用GoogleMaps獲取位置的緯度和經(jīng)度,請(qǐng)?jiān)贕oogleMaps中輸入所需的地址(在本例中為“東京日本”)并按下進(jìn)入。然后右擊在地圖上的位置名稱(“東京”)上顯示上下文菜單。選擇并單擊菜單項(xiàng)“這是什么“拿出一張位置卡,上面顯示著它的緯度和經(jīng)度:

使用JavaScript和Google時(shí)區(qū)API顯示任何城市的本地時(shí)間

或者,您也可以使用類似于latlong.net得到那些神秘的數(shù)字。

-得到timestamp任何日期的值

這,這個(gè),那,那個(gè)timestampGoogle時(shí)區(qū)API的參數(shù)期望所需的日期和時(shí)間從1970年1月1日午夜開始以秒為單位表示。對(duì)于當(dāng)前時(shí)間,計(jì)算方法是先實(shí)例化Date對(duì)象以獲取用戶計(jì)算機(jī)的當(dāng)前本地時(shí)間,然后使用以下方法添加UTC偏移量(以分鐘為單位)Date.getTimezoneOffset():

1

2

var targetDate = new Date() // Current date/time of user computer

var timestamp = targetDate.getTime()/1000 + targetDate.getTimezoneOffset() * 60 // Current UTC date/time expressed as seconds since midnight, January 1, 1970 UTC

因?yàn)?code>timestamp參數(shù)應(yīng)該以秒為單位,我們做一個(gè)小的數(shù)學(xué)把當(dāng)前的日期和它的UTC偏移到那個(gè)單位。這里有一個(gè)時(shí)間戳,代表從1970年世界協(xié)調(diào)時(shí)1月1日午夜開始的時(shí)間和日期,正如醫(yī)生所吩咐的。

如果您感興趣的目標(biāo)日期不是當(dāng)前日期/時(shí)間,只需將特定日期字符串傳入new Date()實(shí)例化它時(shí),例如:

1

var targetDate = new Date('December 25, 2025')

這對(duì)于未來或過去的相關(guān)應(yīng)用都是有用的,比如追溯到2025年的圣誕節(jié)東京時(shí)間。見在這里實(shí)例化日期對(duì)象的各種方法.

在最后apicall變量現(xiàn)在包含我們可以發(fā)出的Google時(shí)區(qū)請(qǐng)求,以獲取一些有用的信息:

1

var apicall = 'https://maps.googleapis.com/maps/api/timezone/json?location=' + loc + '&timestamp=' + timestamp + '&key=' + apikey

打那個(gè)電話-為地球上的某個(gè)特定地點(diǎn)爭(zhēng)取時(shí)間

現(xiàn)在,我們已經(jīng)準(zhǔn)備好使用Ajax來接電話,并使用前面構(gòu)建的請(qǐng)求字符串調(diào)用時(shí)區(qū)API。返回的數(shù)據(jù)為我們提供了東京的正確時(shí)區(qū)和DST偏移量,然后我們可以使用這些數(shù)據(jù)來確定該城市的正確日期和時(shí)間:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

var loc = '35.731252, 139.730291' // Tokyo expressed as lat,lng tuple

var targetDate = new Date() // Current date/time of user computer

var timestamp = targetDate.getTime()/1000 + targetDate.getTimezoneOffset() * 60 // Current UTC date/time expressed as seconds since midnight, January 1, 1970 UTC

var apikey = 'YOUR_TIMEZONE_API_KEY_HERE'

var apicall = 'https://maps.googleapis.com/maps/api/timezone/json?location=' + loc + '&timestamp=' + timestamp + '&key=' + apikey

 

var xhr = new XMLHttpRequest() // create new XMLHttpRequest2 object

xhr.open('GET', apicall) // open GET request

xhr.onload = function(){

    if (xhr.status === 200){ // if Ajax request successful

        var output = JSON.parse(xhr.responseText) // convert returned JSON string to JSON object

        console.log(output.status) // log API return status for debugging purposes

        if (output.status == 'OK'){ // if API reports everything was returned successfully

            var offsets = output.dstOffset * 1000 + output.rawOffset * 1000 // get DST and time zone offsets in milliseconds

            var localdate = new Date(timestamp * 1000 + offsets) // Date object containing current time of Tokyo (timestamp + dstOffset + rawOffset)

            console.log(localdate.toLocaleString()) // Display current Tokyo date and time

        }

    }

    else{

        alert('Request failed.  Returned status of ' + xhr.status)

    }

}

xhr.send() // send request


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI