在C#中如何将纳秒转换为本地DateTimeOffset?
正确将纳秒转换为DateTimeOffset的方法
先揪出你代码里的小问题:第二个基准时间变量拼写成epochTimfe了,而且result2还是用的epochTime(也就是标记为Local的那个实例),这直接导致result1和result2是同一个计算结果,自然输出完全一致。
不过核心问题是你还没充分利用DateTimeOffset的特性,下面一步步给你讲正确的实现思路:
先明确基础转换逻辑
.NET里DateTime.Ticks的单位是100纳秒,所以你把纳秒除以100转成ticks的操作是对的。另外要记住:Unix时间戳的基准(epoch)是UTC时间的1970-01-01 00:00:00,所以必须基于UTC的基准时间来计算,不能用Local的,否则会引入不必要的时区偏差。
方法1:基于Ticks手动构建DateTimeOffset
先把纳秒转成ticks,基于UTC基准时间得到UTC的DateTime,再封装成带偏移量的DateTimeOffset:
long nanoseconds = 1449491983090000000; // 构建UTC时区的Unix基准时间 DateTime utcEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); // 纳秒转ticks后添加到基准时间,得到标准UTC时间 DateTime utcDateTime = utcEpoch.AddTicks(nanoseconds / 100); // 用UTC DateTime创建DateTimeOffset,默认偏移量为UTC+0 DateTimeOffset resultOffset = new DateTimeOffset(utcDateTime);
方法2:利用现成的Unix时间转换API
如果你的纳秒数可以安全转成毫秒(除以1000000),可以直接用框架提供的简化方法,代码更简洁:
long nanoseconds = 1449491983090000000; // 纳秒转毫秒:1纳秒 = 1e-6毫秒 long milliseconds = nanoseconds / 1000000; DateTimeOffset resultOffset = DateTimeOffset.FromUnixTimeMilliseconds(milliseconds);
转换到指定时区的DateTimeOffset
如果需要把UTC时间转成本地时区或者其他特定时区的DateTimeOffset,可以这样做:
long nanoseconds = 1449491983090000000; DateTime utcEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); DateTime utcDateTime = utcEpoch.AddTicks(nanoseconds / 100); // 转成当前系统本地时区的DateTimeOffset DateTimeOffset localOffset = utcDateTime.ToLocalTime(); // 转成指定时区(比如美国东部标准时间) TimeZoneInfo estZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTimeOffset estOffset = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, estZone);
为什么你之前的结果都是GMT时间?
因为你的result1用了Local基准时间,但如果你的本地时区恰好是GMT,或者输出时默认把DateTime转成了UTC格式显示,就会看到这个结果。再加上代码笔误让result2和result1完全一样,自然输出相同的GMT时间。
内容的提问来源于stack exchange,提问作者TheDeveloper
相关产品推荐
相关产品推荐

