【问题标题】:Convert naive datetime with known location to UTC datetime将具有已知位置的原始日期时间转换为 UTC 日期时间
【发布时间】:2019-01-06 13:32:29
【问题描述】:

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

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

我想将日期和时间转换为 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 的配额。

【问题讨论】:

  • 地理位置(坐标)不足以知道用户所在的国家。例如,根尼西岛和泽西岛离法国很近,但属于英格兰。两国之间只有一小时。您应该向用户询问国家/地区或找到一种从网络浏览器获取的方法。
  • 你能要求用户选择他们的时区而不是指定一个位置吗?这让它变得更容易......
  • 这不是您问题的真正答案,但我想确保您知道Second Generation App Engine runtime supports arbitrary dependencies(不过它也只是 Python 3)。

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


【解决方案1】:

为了根据地理位置将本地日期时间信息转换为 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 的所有可能返回值对此进行测试,以确保从 API 返回的内容将被pytz 正确解释(它适用于示例时区“ America/Los_Angeles”,但您需要进行测试以确保它对于您正在处理的地区来说是一个强大的解决方案)。

【讨论】:

    【解决方案2】:

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

    getTimezoneOffset() 方法返回时区差异,在 分钟,从当前区域设置(主机系统设置)到 UTC。

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

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

    【讨论】:

    • 不确定这是否可行。 1/ 因为我目前正在迁移一个事件时间表数据库,我没有收集用户的国家或时区偏移信息和 2/ 因为即使我从客户端捕获 timezoneoffset,在冬季用户时也不会处理 DST正在进入夏季活动的时间。
    猜你喜欢
    • 2015-11-13
    • 2013-05-09
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多