【问题标题】:timezone offset in datetime format in python 3.6python 3.6中日期时间格式的时区偏移
【发布时间】:2023-03-24 21:27:01
【问题描述】:

此代码在 python 3.7 上运行,但在 3.6 上失败

from datetime import datetime
try:
    d = datetime.strptime('2019-07-30T00:00:00.000-05:00', '%Y-%m-%dT%H:%M:%S.%f%z')
    print(d)

except ValueError as ve:
    print(str(ve))

ValueError:时间数据“2019-07-30T00:00:00.000-05:00”与格式“%Y-%m-%dT%H:%M:%S.%f%z”不匹配

时区偏移的格式是什么,例如-05:00 在 python 3.6 中?

【问题讨论】:

  • 如答案中所述,3.6 中的格式为±HHMM[SS[.ffffff]]。如果您的所有字符串都包含时区偏移,并且在小时和分钟之间使用冒号分隔符,您可以使用类似 ''.join(s.rsplit(':', maxsplit=1)) 的内容稍微修改字符串,其中 s 是 ISO 8601 字符串,例如 '2019-07-30T00:00:00.000-05:00'

标签: python timezone


【解决方案1】:

来自docs

对于有意识的对象:

%z utcoffset() 被转换为形式为 ±HHMM[SS[.ffffff]] 的字符串,其中 HH 是给出 UTC 偏移小时数的 2 位字符串,MM 是给出 UTC 偏移量的 2 位字符串分钟,SS 是一个 2 位字符串,给出 UTC 偏移秒数,ffffff 是一个 6 位字符串,给出 UTC 偏移微秒数。当偏移量为整数秒时,ffffff 部分被省略,当偏移量为整数分钟时,ffffff 和 SS 部分都被省略。例如,如果 utcoffset() 返回 timedelta(hours=-3, minutes=-30),则 %z 将替换为字符串 '-0330'。

3.7 版更改:UTC 偏移量不限于整数分钟数。

在 3.7 版中更改:当 %z 指令提供给 strptime() 方法时,UTC 偏移量可以使用冒号作为小时、分钟和秒之间的分隔符。例如,“+01:00:00”将被解析为一小时的偏移量。此外,提供“Z”与“+00:00”相同。

%Z 如果 tzname() 返回 None,则 %Z 将替换为空字符串。否则 %Z 被返回的值替换,该值必须是一个字符串。

这意味着在 3.6 中,您将被限制为偏移量的整数,并且您需要在 3.7 之前删除冒号:

d = datetime.strptime('2019-07-30T00:00:00.000-0500', '%Y-%m-%dT%H:%M:%S.%f%z')

【讨论】:

  • 我无法更改字符串输入(无法删除冒号)。我可以通过其他格式覆盖现有字符串吗?
  • 你能在冒号前后分割字符串吗?
  • 如果您从没想过时区会偏离 :30,您可以使用 '%Y-%m-%dT%H:%M:%S.%f%z:00'),这不太合适,但可能会起作用
【解决方案2】:

3.6 中的格式是±HHMM[SS[.ffffff]]。你可以转换你的字符串

time_str = "2019-07-30T00:00:00.000-05:00"
time_str = time_str[0:-3]+time_str[-2:] 

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2017-03-31
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2019-02-21
    相关资源
    最近更新 更多