将日期时间格式化为带毫秒的字符串

359

如何将datetime对象格式化为带有毫秒的字符串?


1
https://dev59.com/JHVC5IYBdhLWcg3wYQEp - cetver
4
请写一个标题来描述您的问题,并尽量保持问题清晰明了。 - agf
2
值得在这里提到的是,额外的精度通常是可以接受的。例如,Java的Instant.parse可以解析使用strftime('%Y-%m-%dT%H:%M:%S.%fZ')创建的表示形式。 - Jarek Przygódzki
16个回答

1
python -c "from datetime import datetime; print str(datetime.now())[:-3]"
2017-02-09 10:06:37.006

1
datetime
t = datetime.datetime.now()
ms = '%s.%i' % (t.strftime('%H:%M:%S'), t.microsecond/1000)
print(ms)
14:44:37.134

1

我遇到了同样的问题,但在我的情况下,毫秒必须四舍五入而不是截断。

from datetime import datetime, timedelta

def strftime_ms(datetime_obj):
    y,m,d,H,M,S = datetime_obj.timetuple()[:6]
    ms = timedelta(microseconds = round(datetime_obj.microsecond/1000.0)*1000)
    ms_date = datetime(y,m,d,H,M,S) + ms
    return ms_date.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]

0
在Python 3.11中(可能也支持较旧的版本),可以使用isoformat(timespec='milliseconds')来完成。
来自datetime.py的说明:

可选参数timespec指定要包含的时间的附加项数。有效选项包括'auto'、'hours'、'minutes'、'seconds'、'milliseconds'和'microseconds'。

>>> datetime.now().isoformat(timespec='milliseconds')
'2023-12-01T10:34:18.657'

0

字段宽度格式规范

UNIX的date命令允许使用%3来将精度缩减为3位数:

$ date '+%Y-%m-%d %H:%M:%S.%3N'
2022-01-01 00:01:23.456

这是一个可以在Python中完成此操作的自定义函数:

from datetime import datetime

def strftime_(fmt: str, dt: datetime) -> str:
    tokens = fmt.split("%")
    tokens[1:] = [_format_token(dt, x) for x in tokens[1:]]
    return "".join(tokens)

def _format_token(dt: datetime, token: str) -> str:
    if len(token) == 0:
        return ""
    if token[0].isnumeric():
        width = int(token[0])
        s = dt.strftime(f"%{token[1]}")[:width]
        return f"{s}{token[2:]}"
    return dt.strftime(f"%{token}")

使用示例:

>>> strftime_("%Y-%m-%d %H:%M:%S.%3f", datetime.now())
'2022-01-01 00:01:23.456'

注意:不支持使用%%


0

datetime.utcnow()和其他类似的解决方案存在的问题是它们速度较慢。

更高效的解决方案可能看起来像这样:

def _timestamp(prec=0):
    t = time.time()
    s = time.strftime("%H:%M:%S", time.localtime(t))
    if prec > 0:
        s += ("%.9f" % (t % 1,))[1:2+prec]
    return s

在你的情况下(毫秒),prec 将是 3

该函数可以工作到小数点后 9 位(请注意第二个格式化字符串中的数字 9)。

如果您想要四舍五入小数部分,我建议使用所需小数位数动态构建 "%.9f"


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