需要帮助为 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 结果

Mailchimp API 合并字段 - 日期格式

将人类可读的日期转换为纪元时间戳

在 Spark Dataframe API 中将出生日期转换为年龄

BigQuery 帮助 - 如何转换并转换为浮点和日期格式