直接使用tostring("yyyy-mm-dd hh:mm:ss.fff")可输出带三位毫秒的字符串,如"2024-05-22 14:30:45.123";fff表示毫秒(000–999),必须小写,不足补零,不可用sss或大写fff。

DateTime.ToString() 里怎么写出带毫秒的格式
直接用 ToString("yyyy-MM-dd HH:mm:ss.fff") 就能输出到毫秒,比如 "2024-05-22 14:30:45.123"。这里的 fff 表示毫秒(000–999),注意不是 FFF(大写无效),也不是 ff(只两位,会截断)。
常见错误是写成 "yyyy-MM-dd HH:mm:ss.SSS"——S 是“秒的小数部分”占位符,但 .NET 不识别 SSS,会原样输出字母 S;必须用小写 f 系列。
-
fff:固定三位毫秒,不足补零(12.3→012) -
ff:只取前两位(123→12),慎用 -
f:只取第一位(123→1),基本不用 - 想省略末尾零?
ToString("yyyy-MM-dd HH:mm:ss.fff")默认不省略,.NET 没有内置“自动截零”的标准格式符
用 string.Format 或插值字符串时毫秒怎么写
插值中不能直接写 {dt:yyyy-MM-dd HH:mm:ss.fff} 这种写法是合法的,但要注意:如果 dt 是 DateTime?(可空类型),且值为 null,运行时会抛 InvalidOperationException。
推荐写法:
- 安全插值:
$"{dt:yyyy-MM-dd HH:mm:ss.fff}"(仅当dt非 null) - 防 null:
$"{dt?.ToString("yyyy-MM-dd HH:mm:ss.fff") ?? "N/A"}" - 用
string.Format:string.Format("{0:yyyy-MM-dd HH:mm:ss.fff}", dt),同样要求dt非 null
别写 $"{dt:yyyy-MM-dd HH:mm:ss.SSS}"——S 不是毫秒占位符,.NET 会把它当普通字符输出。
为什么有时毫秒显示为 000,明明 DateTime 有精度
DateTime 的底层精度约 15.6ms(取决于系统计时器),而且很多构造方式(比如 DateTime.Now、数据库读取、JSON 反序列化)本身就不带毫秒或只保留到秒/毫秒整数位。
-
DateTime.Now在多数 Windows 环境下实际分辨率约 10–16ms,连续两次调用可能得到相同毫秒值 - SQL Server 的
datetime类型精度是 3.33ms,但datetime2(3)才保证毫秒级;用 EF Core 读出来若没配对精度,可能被截断 - JSON.NET 默认序列化
DateTime用 ISO 8601 格式(如"2024-05-22T14:30:45"),毫秒会被丢掉,除非显式配置DateFormatString = "yyyy-MM-ddTHH:mm:ss.fff"
所以看到 .000 不一定是格式写错了,先查来源是否真包含毫秒数据。
需要更高精度怎么办:用 DateTimeOffset 或 TimeSpan
如果业务真依赖亚毫秒时间(比如高频日志打点、性能采样),DateTime 不够用。这时该换方案:
- 用
Stopwatch测间隔:Stopwatch.GetTimestamp()提供 CPU 周期级精度,配合Stopwatch.Frequency换算纳秒 - 记录绝对时间改用
DateTimeOffset:它和DateTime格式化行为一致,但明确带时区,避免跨系统解析歧义 - 存差值用
TimeSpan:支持ToString("c")或自定义如"hh\:mm\:ss\.fffffff"输出到 100 纳秒(7 位 f)
别为了“看起来更精确”硬塞 fffff——DateTime 根本没有微秒字段,多写的 f 会补零,不代表真实精度。











