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

Convert naive datetime with known location to UTC datetime

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

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

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

我可以根据我的本地日期时间信息给它一个时间戳(因此无需时区校正)它会 return 我需要将本地日期时间转换为 UTC 的 rawOffset 和 dstOffset,但它可能在 DST 传输前后的某个时间段内([-12h,+12 小时],我估计,取决于实际偏移),日期时间不正确,因为我没有提供正确的 UTC 时间戳。

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

我想到的获得一定准确性的一种方法是应用我从 API 收到的 rawOffset 和 dstOffset,再次生成 UTC 时间戳并再次调用 API时间戳。我的结果可能不正确的 DST 过境时间现在应限制为 +/-1 小时。但这在我的印象中太过分了,还要考虑 API.

的配额

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

The getTimezoneOffset() method returns the time zone difference, in minutes, from current locale (host system settings) to UTC.

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

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

为了根据地理位置将本地日期时间信息转换为 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 日期时间对象,并获得 UTC 时间戳 I认为你正在寻找。此方法将根据用户输入的日期处理夏令时。例如:

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 中所有可能的 return 值对 timeZoneId 进行测试,以确保 return 来自 API 将被 pytz 正确解释(它适用于示例时区 "America/Los_Angeles",但您需要进行测试以确保它是您正在处理的地理区域的可靠解决方案)。