DateTime.Now 是获取本地时间的常用方法,返回系统本地时区的完整时间;需 UTC 时间时应直接使用 DateTime.UtcNow;格式化推荐固定字符串如 "yyyy-MM-dd HH:mm:ss" 或 "o";高精度计时用 Stopwatch,带时区场景用 DateTimeOffset。

直接用 DateTime.Now 获取本地当前时间
绝大多数场景下,DateTime.Now 就是你需要的答案。它返回一个 DateTime 对象,包含当前系统本地时区的年、月、日、时、分、秒和毫秒。
注意:它依赖系统时钟和时区设置,不是 UTC 时间,也不自动处理夏令时切换逻辑(但 Windows 系统层会参与调整)。
DateTime now = DateTime.Now; Console.WriteLine(now); // 输出类似:2024-06-12 14:35:22.123
需要 UTC 时间时用 DateTime.UtcNow
如果做跨时区服务、日志时间戳、或与数据库/HTTP API 交互(尤其 RESTful 接口常要求 ISO 8601 UTC 格式),必须用 DateTime.UtcNow,否则可能引发时区错乱或比对错误。
-
DateTime.Now和DateTime.UtcNow的值通常相差几个小时,具体取决于本地时区偏移 - 两者都包含毫秒,精度取决于系统时钟(通常为 10–15ms)
- 不要对
DateTime.Now做减法再转 UTC——结果不可靠,直接用UtcNow
DateTime utcNow = DateTime.UtcNow;
Console.WriteLine(utcNow.ToString("o")); // ISO 8601 格式:2024-06-12T06:35:22.1234567Z
格式化输出要小心文化差异
ToString() 默认使用当前线程的 CultureInfo,可能导致月/日顺序颠倒(如美国 vs 德国),影响日志解析或前端展示。
- 固定格式推荐用标准格式字符串,比如
"yyyy-MM-dd HH:mm:ss" - 需要 ISO 8601 且带时区信息,用
"o"(Round-trip 格式)或"u"(UTC 格式) - 避免用
ToString()无参数调用,尤其在服务器环境(线程文化可能非预期)
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss")); // 安全、明确
高精度或性能敏感场景考虑 Stopwatch 或 DateTimeOffset
DateTime 不适合测量耗时(精度低、有系统时钟跳变风险),也不方便表达“带时区偏移的时间点”。这时候:
- 测执行时间用
Stopwatch,它基于高精度计时器(QueryPerformanceCounter) - 记录带明确时区上下文的时间点(如用户提交时间 + 当地偏移),用
DateTimeOffset,例如DateTimeOffset.Now -
DateTimeOffset.Now比DateTime.Now多存一个Offset,能无歧义还原 UTC 时间
DateTimeOffset nowOffset = DateTimeOffset.Now;
Console.WriteLine(nowOffset.ToString("o")); // 2024-06-12T14:35:22.1234567+08:00
时区偏移、UTC 意识、格式化上下文——这三个点在真实项目里最容易被忽略,一出问题就难定位。










