以ISO格式打印日期时间,不带毫秒

Csa*_*oth 5 python timezone datetime iso

我正在尝试在API中序列化datetime,但我不想要毫秒.我想要的是:https://en.wikipedia.org/wiki/ISO_8601 -"2015-09-14T17:51:31+00:00"

tz = pytz.timezone('Asia/Taipei')
dt = datetime.datetime.now()
loc_dt = tz.localize(dt)
Run Code Online (Sandbox Code Playgroud)

试试A:

loc_dt.isoformat()
>> '2015-09-17T10:46:15.767000+08:00'
Run Code Online (Sandbox Code Playgroud)

试试B:

loc_dt.strftime("%Y-%m-%dT%H:%M:%S%z")
>> '2015-09-17T10:46:15+0800'
Run Code Online (Sandbox Code Playgroud)

后者几乎是完美的,除了在时区部分缺少冒号.如何在没有字符串操作的情况下解决此问题(删除毫秒或添加冒号)?

Pad*_*ham 6

您可以将微秒替换为0并使用isoformat:

import pytz
from datetime import datetime
tz = pytz.timezone('Asia/Taipei')
dt = datetime.now()
loc_dt = tz.localize(dt).replace(microsecond=0)
print loc_dt.isoformat()
2015-09-17T19:12:33+08:00
Run Code Online (Sandbox Code Playgroud)

如果要保持loc_dt,请在输出时进行替换:

loc_dt = tz.localize(dt)
print loc_dt.replace(microsecond=0).isoformat()
Run Code Online (Sandbox Code Playgroud)

如评论你最好传递tzdatetime.now:

 dt = datetime.now(tz)
Run Code Online (Sandbox Code Playgroud)

原因在pep-0495中讨论过,你可能还想在执行替换时添加一个断言来捕获任何错误:

 ssert loc_dt.resolution >= timedelta(microsecond=0)
Run Code Online (Sandbox Code Playgroud)

  • 哇,从解析器的角度来看这很奇怪。如果微秒由于某种原因为 0,那么它会从输出中完全省略吗?如果分钟或秒为零,则不会省略。 (3认同)
  • 解析:/sf/ask/8946241/令人难以置信!!! (2认同)