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

标签 python datetime google-app-engine timezone utc

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

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

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

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

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

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

我想到的获得一定精度的一种方法是应用从 API 收到的 rawOffset 和 dstOffset,再次生成 UTC 时间戳,并使用该时间戳再次调用 API。在 DST 过境期间,我的结果可能不正确的时间现在应限制在 +/-1 小时内。但考虑到 API 的配额,这超出了我的印象。

最佳答案

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

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”,但您需要进行测试以确保它对于您正在处理的地理位置来说是一个可靠的解决方案)。

关于python - 将已知位置的原始日期时间转换为 UTC 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54062014/

相关文章:

python - App Engine 数据存储区了解 noSql

python - 谷歌应用引擎和谷歌云 sql 上的 Flask SqlAlchemy

python - Tkinter 标签中的图像?

c# - 获取连续的日期范围

java - 使用 JSR 310(DateTime API)的军事时区

Mysql:计算访问频率

GAE : sqlite "ImportError: cannot import name utils" 上的 Django 1.4

python - 从(行、列、值)数据创建 Pandas DataFrame

python - 如何为文档的长度运行一个函数

python - 如何在单个资源中创建多个 GET 端点?