如何将datetime
对象格式化为带有毫秒的字符串?
python -c "from datetime import datetime; print str(datetime.now())[:-3]"
2017-02-09 10:06:37.006
datetime
t = datetime.datetime.now()
ms = '%s.%i' % (t.strftime('%H:%M:%S'), t.microsecond/1000)
print(ms)
14:44:37.134
我遇到了同样的问题,但在我的情况下,毫秒必须四舍五入而不是截断。
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]
isoformat(timespec='milliseconds')
来完成。datetime.py
的说明:
可选参数timespec指定要包含的时间的附加项数。有效选项包括'auto'、'hours'、'minutes'、'seconds'、'milliseconds'和'microseconds'。
>>> datetime.now().isoformat(timespec='milliseconds')
'2023-12-01T10:34:18.657'
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'
注意:不支持使用%%
。
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"
。
Instant.parse
可以解析使用strftime('%Y-%m-%dT%H:%M:%S.%fZ')
创建的表示形式。 - Jarek Przygódzki