需要帮助为 Google API 格式化日期时间时区
Posted
技术标签:
【中文标题】需要帮助为 Google API 格式化日期时间时区【英文标题】:Need help formatting datetime timezone for Google API 【发布时间】:2017-11-02 15:59:45 【问题描述】:我已从 bigquery 记录中检索到日期时间(使用 google.cloud.bigquery 库),需要根据 @987654322 的“startTime”参数以 rfc 3339 格式将其发送到 google admin sdk 报告 API @。 API 期望日期时间如下所示:
2010-10-28T10:26:35.000Z
这通常可以通过创建不带 tzinfo 的 python 日期时间并像这样调用 isoformat 来实现:
>>> now = datetime.utcnow()
>>> now = now.isoformat("T") + "Z"
>>> now
'2017-06-01T13:05:32.586760Z'
我遇到的问题是来自 BigQuery 的时间戳包含一个 tzinfo 对象,这导致 isoformat 返回 Google API 无法处理的文本。
>>> timestamp_from_bigquery
'datetime.datetime(2017, 5, 31, 16, 13, 26, 252000, tzinfo=<UTC>)'
>>> timestamp_from_bigquery.isoformat("T") + "Z"
'2017-05-31T16:13:26.252000+00:00Z'
具体来说,Google 的 API 不接受 +00:00 作为 startTime。如果我从字符串中手动删除 +00:00,API 调用就可以工作,但我不确定如何在没有丑陋字符串 hack 的情况下在 python 中执行此操作。是否有一些干净的方法可以从日期时间对象中删除它?
我也试过这个,但结果是一样的:
>>> timestamp_from_bigquery.replace(tzinfo=None)
'2017-05-31T16:13:26.252000+00:00Z'
【问题讨论】:
一种可能性是将strftime
与格式字符串一起使用:datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ')
【参考方案1】:
使用datetime.datetime.strftime()
:
datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ')
timestamp_from_bigquery.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
当然要确保日期时间在正确的时区。
【讨论】:
谢谢,我想这正是我所需要的。而不是 2017-05-31T16:13:26.252000+00:00Z 我现在有 2017-05-31T16:13:26.252000Z,它适用于 API。假设'252000'是毫秒,对吧? Z 是没有偏移的 UTC,对吧? 是的%f
是毫秒(看看available directives for strftime)。 Z
这里只是一个表示 Zulu/UTC 的字符,它不会对日期时间做任何事情,因此在执行 strftime
之前,您必须首先确保日期时间在 Zulu/UTC 时区中。对于您描述的两种情况,您应该没问题。仅供参考:如果您必须处理时区,请查看pytz package。
来自 bigquery 记录的日期时间是 UTC,没有偏移量,所以应该不错。再次感谢。以上是关于需要帮助为 Google API 格式化日期时间时区的主要内容,如果未能解决你的问题,请参考以下文章
将 INT 中的日期转换为 Google Calendar API 的 CreateEvent 的 DateTime
以 XML/JSON 格式返回 Google Analytics Reporting API 结果