C#夏令时期间UTC转CST时区DateTimeOffset异常求助
问题诊断与解决方案
首先,你的问题核心在于输入的DateTime对象没有被正确标记为UTC时间,导致TimeZoneInfo.ConvertTime使用了错误的转换逻辑,才会出现转换后时间和原时间一致的情况。
为什么转换会失败?
TimeZoneInfo.ConvertTime的行为完全依赖于输入DateTime的Kind属性:
- 如果
time.Kind是DateTimeKind.Utc:方法会正确将UTC时间转换到目标时区 - 如果
time.Kind是DateTimeKind.Unspecified或DateTimeKind.Local:方法会默认把输入当成本地时间(或未指定时区的时间)来处理,而非UTC时间,自然得不到你想要的转换结果
从你给出的输入来看,从数据库读取的time = {3/11/2018 3:24:19 AM},它的Kind大概率是Unspecified——这是数据库读取DateTime时的默认类型,这就是问题的根源。
修复方案
方法1:先标记输入为UTC再转换
先把你的time对象明确标记为UTC时间,再执行转换:
// 给数据库读取的DateTime打上UTC标记 DateTime utcTime = DateTime.SpecifyKind(time, DateTimeKind.Utc); // 转换到目标时区 DateTimeOffset returnTime = TimeZoneInfo.ConvertTime(utcTime, timeZone);
方法2:用ConvertTimeFromUtc更直观
既然你明确知道输入是UTC时间,直接用这个方法可以避免Kind属性带来的歧义:
// 注意:如果time的Kind是Local会抛出异常,建议先标记为Utc确保安全 DateTime utcTime = DateTime.SpecifyKind(time, DateTimeKind.Utc); DateTimeOffset returnTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, timeZone);
结果验证
2018年3月11日是美国中部夏令时(CDT,UTC-5)启用的日期(当地时间凌晨2点拨快到3点),UTC时间3/11/2018 3:24:19 AM减去5小时后,正好是3/10/2018 10:24:19 PM,和你的预期完全一致。
内容的提问来源于stack exchange,提问作者M.Nishanthan
相关产品推荐
相关产品推荐

