C#中时间戳与DateTime互转后值不一致问题求助
问题原因及解决方法
问题原因
Unix时间戳本身是基于UTC时区的,你的代码中存在两个关键问题导致时间戳偏差:
- 从
DateTimeOffset提取DateTime时,得到的DateTime对象Kind属性为DateTimeKind.Unspecified(无明确时区标记)。 - 将无时区标记的
DateTime强制转换为DateTimeOffset时,.NET会默认使用本地系统时区解析该时间,导致生成的DateTimeOffset携带本地时区偏移量(你的情况差2小时,说明本地时区为UTC+2),最终转成Unix时间秒时与原始值产生偏差。
解决方法
方法1:全程使用DateTimeOffset(推荐)
直接保留时区信息,避免DateTime的Kind属性歧义:
DateTimeOffset stamp = DateTimeOffset.FromUnixTimeSeconds(long.Parse(SplitLine[4])); Console.WriteLine($"{SplitLine[4]} becomes {stamp.ToUnixTimeSeconds()}");
方法2:明确指定DateTime的时区为UTC
如果必须使用DateTime类型,转换时明确标记为UTC时间,转回时也基于UTC处理:
// 标记DateTime为UTC时区 DateTime stamp = DateTime.SpecifyKind( DateTimeOffset.FromUnixTimeSeconds(long.Parse(SplitLine[4])).DateTime, DateTimeKind.Utc ); // 基于UTC转回时间戳 Console.WriteLine($"{SplitLine[4]} becomes {new DateTimeOffset(stamp, TimeSpan.Zero).ToUnixTimeSeconds()}");
或者简化为直接指定UTC偏移量转回:
DateTime stamp = DateTimeOffset.FromUnixTimeSeconds(long.Parse(SplitLine[4])).DateTime; Console.WriteLine($"{SplitLine[4]} becomes {new DateTimeOffset(stamp, TimeSpan.Zero).ToUnixTimeSeconds()}");
两种方法都能保证转换前后时间戳完全一致,因为全程基于UTC时区处理。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

