c# 如何获取当前时间

9次阅读

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

c# 如何获取当前时间

直接用 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.NowDateTime.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")); // 安全、明确

高精度或性能敏感场景考虑 StopwatchDateTimeOffset

DateTime 不适合测量耗时(精度低、有系统时钟跳变风险),也不方便表达“带时区偏移的时间点”。这时候:

  • 测执行时间用 Stopwatch,它基于高精度计时器(QueryPerformanceCounter
  • 记录带明确时区上下文的时间点(如用户提交时间 + 当地偏移),用 DateTimeOffset,例如 DateTimeOffset.Now
  • DateTimeOffset.NowDateTime.Now 多存一个 Offset,能无歧义还原 UTC 时间
DateTimeOffset nowOffset = DateTimeOffset.Now; Console.WriteLine(nowOffset.ToString("o")); // 2024-06-12T14:35:22.1234567+08:00

时区偏移、UTC 意识、格式化上下文——这三个点在真实项目里最容易被忽略,一出问题就难定位。

text=ZqhQzanResources