我尝试通过获取网站访问者的当前时间,然后将其与位置一起插入到 Google 时区 API 中,来比较网站访问者位置和设定位置之间的小时数。然而,无论我如何扭转它,它似乎都是不正确的1或2小时。
我读错了什么吗?
请求:
https://maps.googleapis.com/maps/api/timezone/json?location=40.7127753,-74.0059728×tamp=1569956387&key=API_KEY
输出:
{
"dstOffset" : 3600,
"rawOffset" : -18000,
"status" : "OK",
"timeZoneId" : "America/New_York",
"timeZoneName" : "Eastern Daylight Time"
}
请求的第一部分是纽约市的经度和纬度(从 Google Places API 检索),第二个值(时间戳)是自 1970 年 1 月 1 日以来的秒数。这是我使用以下 JavaScript 从访问者处获取的:
+ new Date()
if (!Date.now) {
Date.now = function() { return new Date().getTime(); }
}
Math.floor(Date.now() / 1000)
..对我来说结果是: 1569956387(秒)
Date.now() 返回自 1970 年 1 月 1 日以来的毫秒数,因此我需要除以 1000 转换为秒,因为 Google Time Zone API 使用自 1970 年 1 月 1 日以来的秒数。
根据 Google Time Zone API 文档:
rawOffset:给定位置相对于 UTC 的偏移量(以秒为单位)。这不会影响夏令时。
..rawOffset 是 JSON 输出
timestamp 将所需时间指定为自 UTC 1970 年 1 月 1 日午夜以来的秒数。时区 API 使用时间戳来根据位置的时区确定是否应应用夏令时。请注意,该 API 不考虑历史时区。也就是说,如果您指定过去的时间戳,API 不会考虑该位置之前位于不同时区的可能性。
..timestamp 是请求链接中指定的自 1970 年 1 月 1 日以来的秒数
我的本地时间目前是晚上 9:59 (1569956387)。计算 (18000/60)/60 或 (21600/60)/60 告诉我纽约市应该分别有 5 或 6 小时的路程,而事实是 7 小时的路程。
最佳答案
一些事情:
您不需要为
Date.now
创建函数,除非您仍然需要支持 IE8,这在当今很少见。 IE9+ 和所有主流浏览器都内置了该功能。Date.now()
和new Date().getTime()
返回基于 UTC 的时间戳,而不是您的本地时间。从哪个时区运行它并不重要,重要的是您的计算机时钟同步。Google 时区 API 也采用 UTC 格式的时间戳,因此您正在做正确的事情来传递它(将毫秒调整为秒)。
对于给定的时间戳,Google 正确地告诉您:
- 给出的经纬度坐标位于由
America/New_York
IANA 时区 ID 标识的时区 - 要显示的英文长格式名称是
东部夏令时间
rawOffset
为-18000
秒,或 UTC-5。该字段不包括夏令时,因此如果东部标准时间生效(这不是给定的时间戳),则它将使用偏移量dstOffset
的效果为3600
秒(或 1 小时),当将其添加到原始偏移量时,您会得到 (-18000
) > +3600
==-14400
),或 UTC-4
- 给出的经纬度坐标位于由
Google 仅告诉您相对于 UTC 的偏移量,而不是相对于您本地时区的偏移量。如果您想包含该内容,可以调用
new Date().getTimezoneOffset()
(基于当前时间)并将其添加到结果中。
关于javascript - Google 时区 API 的小时数不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58190782/