直接用 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 意识、格式化上下文——这三个点在真实项目里最容易被忽略,一出问题就难定位。 