我的应用程序的用户输入提供的计划事件
- 日期
- 开始时间
- 结束时间
- 地理位置(在地图上)
我想将日期和时间转换为UTC。我的应用程序在GAE(Python)上,所以像timezonefinder或pytzwhere这样的工具不起作用(模块在GAE运行时不支持依赖项)。
使用在线API将是一个解决方案。到目前为止,我检查了谷歌时区API。您向它提供一个地理位置,它将返回时区信息。然而,要处理DST,您还必须为它提供一个时间戳奇怪的是,您必须提供UTC时间戳作为输入,而这正是我想要的输出
我可以根据我的本地日期时间信息给它一个时间戳(因此不需要时区校正),它会返回我将本地日期时间转换为UTC所需的rawOffset和dstOffset,但在夏令时过境前后的某个时间段(我认为[-12小时,+12小时],取决于实际偏移量),它可能不正确,因为我没有提供正确的UTC时间戳。
是否有一种明显的(在线)方法可以根据地理位置将本地日期时间转换为UTC日期时间
我想到的一种获得准确性的方法是应用从API接收的rawOffset和dstOffset,再次生成UTC时间戳,并使用该时间戳再次调用API。夏令时过境前后,我的结果可能不正确,现在应该限制在+/-1小时内。但在我的印象中,考虑到API的配额,这太过分了。
为了根据地理位置将本地日期时间信息转换为UTC,您只需将任意时间戳传递给Google时区API,主要目的是检索该位置的timeZoneId
。
请求示例:
https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510×tamp=0&key=YOUR_API_KEY
示例响应:
{
"dstOffset" : 0,
"rawOffset" : -28800,
"status" : "OK",
"timeZoneId" : "America/Los_Angeles",
"timeZoneName" : "Pacific Standard Time"
}
然后,您可以使用timeZoneId
和用户输入的日期和时间信息以及pytz
在本地时间创建一个python日期时间对象,并获得我认为您正在寻找的UTC时间戳。此方法将根据用户输入的日期处理夏令时。例如:
from datetime import datetime
from pytz import timezone, utc
pacific = timezone('America/Los_Angeles')
pdt = pacific.localize(datetime(2018, 5, 1, 8, 0, 0))
pst = pacific.localize(datetime(2018, 12, 1, 8, 0, 0))
pdt_utc = pdt.astimezone(utc)
pst_utc = pst.astimezone(utc)
# Pacific Daylight Time
print(pdt)
# 2018-05-01 08:00:00-07:00
# Pacific Standard Time
print(pst)
# 2018-12-01 08:00:00-08:00
# UTC
print(pdt_utc)
# 2018-05-01 15:00:00+00:00
print(pst_utc)
# 2018-12-01 16:00:00+00:00
重要提示:我还没有用API针对timeZoneId
的所有可能返回值进行测试,以确保pytz
正确解释API返回的内容(它适用于示例时区"America/Los_Angeles",但您需要进行测试,确保它对您所处的地区是一个稳健的解决方案)。
在您的网页中,您可以使用JavaScript函数getTimezoneOffset
来计算用户本地时间和UTC时间之间的时差:
getTimezoneOffset()
方法返回时区差异分钟,从当前区域设置(主机系统设置)到UTC。
然后,您可以向所有需要时区偏移量的URL添加一个参数。另一个解决方案是把它放在饼干里。
从服务器端,您可以检索时区偏移量来计算UTC日期/时间。