Python datetime模块如何使用毫秒而非微秒处理指定日期格式
核心结论
DateTime类型本身的内部存储以时间戳/刻度值的形式保存时间,不会区分毫秒、微秒的展示格式。你观测到的2021-06-22T11:17:09.465000格式是序列化/字符串输出环节的配置问题,不需要修改DateTime的存储逻辑,也完全可以在保留DateTime类型的前提下实现毫秒级精度输出。
通用实现思路
要同时满足「保留DateTime类型」和「只保留毫秒精度」,两步操作即可:
- 先对DateTime对象的微秒部分做截断,仅保留前三位有效数值,后三位清零,这一步不会改变数据的DateTime类型
- 输出/序列化时,指定格式仅展示3位毫秒位即可
常见场景代码实现
Python(datetime模块)
- 截断DateTime精度到毫秒(保留DateTime类型):
from datetime import datetime dt = datetime.utcnow() # 微秒位后三位清零,仍为datetime类型 dt = dt.replace(microsecond=dt.microsecond // 1000 * 1000)
- 输出指定毫秒格式:
# 格式化输出为要求的格式 format_str = dt.strftime('%Y-%m-%dT%H:%M:%S.') + f"{dt.microsecond // 1000:03d}Z"
C#(DateTime结构)
- 截断DateTime精度到毫秒(保留DateTime类型):
DateTime dt = DateTime.UtcNow; // 1tick = 100纳秒,10000tick = 1毫秒,整除后清零微秒部分 dt = new DateTime(dt.Ticks / 10000 * 10000, dt.Kind);
- 输出指定毫秒格式:
string formatStr = dt.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
数据库存储场景
如果是向数据库存储DateTime类型数据:
- 建表时直接指定字段精度为毫秒级即可,例如MySQL使用
DATETIME(3),PostgreSQL使用TIMESTAMP(3),数据库会自动截断微秒部分存储,取出后也不会生成多余的三位0 - 不需要修改业务代码中的DateTime类型,仅需控制序列化输出格式即可满足要求
内容的提问来源于stack exchange,提问作者Javier Romero.
相关产品推荐
相关产品推荐

