如何在Python 3.5中获取具有毫秒级而非微秒级的ISO8601日期时间字符串

11

给定以下日期时间:

d = datetime.datetime(2018, 10, 9, 8, 19, 16, 999578, tzinfo=dateutil.tz.tzoffset(None, 7200))

d.isoformat()的结果是字符串:

'2018-10-09T08:19:16.999578+02:00'

如何获得带毫秒的字符串而不是微秒:

'2018-10-09T08:19:16.999+02:00'

strftime()在此处无法使用:%z返回0200而不是02:00,并且仅具有%f可获取微秒,没有毫秒占位符。


可能是在Python中使用%f和strftime()获取微秒的重复问题。 - deadvoid
strftime():%z返回0200而不是02:00,并且只有%f可以获取微秒,没有毫秒的占位符。 - cytrinox
将时间数据格式化为字符串仍然使用 str.format(),如果您可以从 datetime 对象中获取微秒和毫秒,则可以以任何 str.format 可以执行的方式格式化字符串表示形式。strftime() 正是提供了这种方法。 - deadvoid
2个回答

14

如果你可以使用不带冒号的时区,则可以使用

d = datetime.datetime(2018, 10, 9, 8, 19, 16, 999578, 
                      tzinfo=dateutil.tz.tzoffset(None, 7200))
s = d.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + d.strftime('%z')
# '2018-10-09T08:19:16.999+0200'

对于冒号,你需要分割时区并自己添加。 %z 也不会为 UTC 生成 Z


而 Python 3.6 支持 timespec='milliseconds',所以你应该进行适配:

try:
    datetime.datetime.now().isoformat(timespec='milliseconds')
    def milliseconds_timestamp(d):
        return d.isoformat(timespec='milliseconds')

except TypeError:
    def milliseconds_timestamp(d):
        z = d.strftime('%z')
        z = z[:3] + ':' + z[3:]
        return d.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + z

鉴于Python 3.6中的后一定义,

>>> milliseconds_timestamp(d) == d.isoformat(timespec='milliseconds')
True

>>> milliseconds_timestamp(d)
'2018-10-09T08:19:16.999+02:00'

冒号很重要,它必须在Python 3.5中运行。 - cytrinox
@cytrinox 那么我的后面摘录 - Antti Haapala -- Слава Україні

0

在3.10版本(可能更早的版本也可以),你可以用一行代码实现它

>>> now = datetime.datetime.now()
>>> tz = datetime.timezone(datetime.timedelta(hours=-6), name="CST")
>>> now_tz = now.replace(tzinfo=tz)
>>> now_tz.isoformat("#","milliseconds")
'2023-03-02#11:02:07.592-06:00'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接