DateTime.UtcNow vs DateTime.Now(C#)
一句话总结
DateTime.UtcNow:获取世界协调时间(UTC,零时区),不受电脑系统时区影响。DateTime.Now:获取本地时间 = UTC 时间 + 当前操作系统时区偏移。
详细对比
var now = DateTime.Now;
var utcNow = DateTime.UtcNow;
表格
| 项目 | DateTime.Now | DateTime.UtcNow |
|---|---|---|
| 含义 | 本机系统的本地时间 | UTC 标准时间(格林威治时间) |
| Kind 属性 | DateTimeKind.Local | DateTimeKind.Utc |
| 受系统时区影响 | ✅ 会变,换时区时间就变 | ❌ 不受时区影响,全球同一时刻值相同 |
| 夏令时 | ✅ 会受夏令时切换影响,可能出现时间重复 / 断层 | ❌ 没有夏令时问题 |
| 推荐场景 | 仅展示给当前本地用户看 | 数据库存储、日志、跨时区系统、时间计算、MES / 上位机强烈推荐 |
简单例子
假设你电脑时区是东八区(UTC+8):
UtcNow = 2026-10-16 03:00:00
Now = 2026-10-16 11:00:00
Now = UtcNow + 8小时
重点坑:不要用 DateTime.Now 存到数据库! 如果服务器换时区、客户机器时区不一样,时间就乱掉。日志、设备采集时间、订单时间一律优先存 UTC。
互相转换
DateTime localTime = utcTime.ToLocalTime(); // UTC → 本地
DateTime utcTime = now.ToUniversalTime(); // 本地 → UTC
额外提醒(踩坑点)
DateTime的 Kind 很重要! 如果你手动构造new DateTime(xxx),Kind 是Unspecified,调用.ToUniversalTime()会把它当成本地时间去转换,容易出错。- 更高版本推荐:
DateTimeOffset.UtcNow自带时区偏移信息,比 DateTime 更稳妥,跨时区场景首选。
适合你的场景(MES / 上位机、PLC 采集、日志)
✅ 采集设备时间、写日志、入库:用 DateTime.UtcNow 原因:
- 多台电脑时区不一致也不会乱;
- 不存在夏令时跳变;
- 日志按时间排序不会出现跨时区错乱。 界面展示的时候,再转成本地时间给操作员看即可。