将已知位置的原始日期时间转换为UTC日期时间

时间:2019-01-06 13:32:30

标签: python datetime google-app-engine timezone utc

我的应用程序的用户输入计划提供的事件

  • 日期
  • 开始时间
  • 结束时间
  • 地理位置(在地图上)

我想将日期和时间转换为UTC。我的应用程序基于GAE(Python),因此诸如timezonefinder或pytzwhere之类的工具无法正常工作(GAE运行时不支持模块的依赖项)。

使用在线API是一种解决方案。到目前为止,我检查了Google时区API。您为其提供地理位置,它将返回时区信息。但是,要处理DST,您还必须为其提供时间戳。 奇怪的是,您必须提供UTC时间戳作为输入,而这正是我想要的输出!

我可以根据本地日期时间信息为其提供时间戳(因此无需进行时区校正),它将返回我需要将本地日期时间转换为UTC的rawOffset和dstOffset,但是在某些情况下,日期时间可能不正确我估计是DST过渡期间的时间段([-12h,+ 12小时],这取决于实际的偏移量),因为我没有提供正确的UTC时间戳。

是否存在一种明显的(在线)方法,可以根据地理位置将本地日期时间转换为UTC日期时间?

获得某种精度的一种方法是应用从API接收到的rawOffset和dstOffset,再次生成UTC时间戳,并再次使用该时间戳调用API。现在,夏令时过境期间我的结果可能会不正确,现在应该限制为+/- 1小时。但是,考虑到API的配额,这对我的印象来说是最重要的。

2 个答案:

答案 0 :(得分:3)

为了根据地理位置将本地日期时间信息转换为UTC,您可以将任意时间戳传递给Google Time Zone API,其主要目的是检索位置的timeZoneId

示例请求:

https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=0&key=YOUR_API_KEY

示例响应:

{
   "dstOffset" : 0,
   "rawOffset" : -28800,
   "status" : "OK",
   "timeZoneId" : "America/Los_Angeles",
   "timeZoneName" : "Pacific Standard Time"
}

然后,您可以使用timeZoneId和用户输入的日期和时间信息以及pytz在本地时间创建python datetime对象,并获得我认为您要查找的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

重要提示:我没有使用timeZoneId的API的所有可能返回值对它进行测试,以确保pytz正确地解释了API返回的内容(它与示例时区“ America / Los_Angeles”,但您需要进行测试以确保它是您所处理的地理位置的可靠解决方案)。

答案 1 :(得分:0)

在您的网页中,您可以使用JavaScript函数getTimezoneOffset计算用户本地时间与UTC时间之间的时差:

  

['T1', 'T2', 'V', 'T4', 'T5', 'V', 'V', 'T8', 'T9', 'T10', 'V', 'T12', 'T13', 'V', 'V', 'T16', 'T17', 'T18', 'V', 'T20'] 方法返回时区差,以   分钟,从当前语言环境(主机系统设置)到UTC。

然后,您可以向所有需要时区偏移的URL添加参数。另一个解决方案是将其放入Cookie。

从服务器端,您可以检索时区偏移量以计算UTC日期/时间。