1. DateTime.Now与DateTime.UtcNow的本质区别
第一次用C#处理时间戳时,我在数据库里发现同一条记录的创建时间比实际晚了8小时——这就是没搞清本地时间与UTC时间区别的典型后果。DateTime.Now和DateTime.UtcNow虽然都返回当前时间,但背后的时区逻辑完全不同。
DateTime.Now获取的是带本地时区的时间。比如我在北京时间下午3点调用它,返回的Kind属性会是DateTimeKind.Local,且值包含时区偏移量。而DateTime.UtcNow返回的是零时区时间,其Kind属性为DateTimeKind.Utc。举个例子:
DateTime localTime = DateTime.Now; // 输出:2024-07-20 15:00:00 (假设当前时区UTC+8)
DateTime utcTime = DateTime.UtcNow; // 输出:2024-07-20 07:00:00
关键差异体现在三个方面:
- 时区处理:Now包含系统时区偏移,UtcNow始终是零时区
- 夏令时影响:Now会随夏令时调整变化,UtcNow不受影响
- 序列化风险:本地时间序列化到不同时区环境可能引发时间错乱
2. 时区陷阱与转换实战
去年我们团队就踩过一个坑:美国用户提交的订单时间在亚洲服务器上显示提前了13小时。这是因为直接用DateTime.Now存储了客户端时间。正确的做法应该是:
2.1 时区转换方法
// 本地转UTC(推荐存储方案)
DateTime utcForDatabase = DateTime.Now.ToUniversalTime();
// UTC转特定时区
TimeZoneInfo cstZo

884

被折叠的 条评论
为什么被折叠?



