LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

千万别用 DateTime.Now!.NET 时间获取的隐藏坑你踩过没?

admin
2025年9月2日 2:1 本文热度 138

日期和时间相关的 bug,永远是写业务代码时容易忽视的大坑。我刚入行时,几乎每个时间戳都直接DateTime.Now,直到有一天,线上报了个“订单时间提前了6小时”的严重 bug。今天聊聊.NET中DateTime.Now的那些坑,以及如何优雅地处理时间。

DateTime.Now 与 DateTime.UtcNow 究竟差了什么?

真实场景

想象下,你在中国服务器上用DateTime.Now记录订单创建时间,把这个时间存数据库,日后用于各种报表、通知,甚至对接海外系统。突然,某天服务器被迁移到伦敦,或者有微服务在其它时区,瞬间表里的时间全错——不是提前就是延后。

两者差别

  • • DateTime.Now:返回本地时区时间,受服务器当前所在时区影响。当服务器时区有变动,历史数据就可能混乱。
  • • DateTime.UtcNow:UTC 时间,全世界统一,对分布式系统、微服务极其友好。

推荐实践:优先使用 UTC 时间

我现在除了做业务逻辑直接跟 UI 展示相关的,都用DateTime.UtcNow存储,只有UI展示时再做时区转换。这极大减少了跨时区的 bug,也让系统变得健壮。

代码示例

// 写入数据库前
var createdUtc = DateTime.UtcNow;
SaveToDb(orderId, createdUtc); // 存储统一 UTC 时间

// 展示时转换为用户时区
var userTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
var displayTime = TimeZoneInfo.ConvertTimeFromUtc(createdUtc, userTimeZone);
Console.WriteLine($"订单创建时间: {displayTime}");

开发常见误区

  • • **误区一:只有海外业务才用 UTC。**其实只要有多台服务器、云部署,这事就得注意。
  • • **误区二:DateTime.Now能自动感知时区变化。**其实它只是当前操作系统时区,不是用户真实时区。

最佳实践清单

  • • 数据库存储一律用DateTime.UtcNow
  • • 展示时明确用户时区,做转换。
  • • 日志、审计、接口调用时间,也建议用 UTC。

踩坑总结

早期公司时区变更,把表里本地时间误认成 UTC,导致历史订单全乱,临时写了几十行脚本才勉强修正。建议大家把这事早早规范,特别是涉及分布式、微服务、海外业务的项目。


结论:
以后动手写DateTime.Now前,先问自己——这玩意存下来后,时区变了会不会挂?只要有疑虑,直接上DateTime.UtcNow,展示时再转换。本地时间只做瞬时展示,存储永远 UTC,后患无穷全赶走!


该文章在 2025/9/2 12:06:42 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved