如何正确转换Unix时间戳为DateTime?转换结果不符问题咨询
看起来你的问题出在时区基准上!Unix时间戳的定义是从UTC时间1970年1月1日00:00:00开始的秒数,但你的代码里new DateTime(1970, 1, 1)默认创建的是本地时区的DateTime实例,这就导致后续计算出的时间和预期的UTC/目标时区时间出现偏移。
你得到的24/03/2018 23:00:00,说明你的本地时区比UTC晚1小时(比如UTC-1时区),而你预期的应该是UTC时间的25/03/2018 00:00:00或者对应你本地时区的正确时间。
下面是几种正确的实现方式:
1. 转换为UTC时间(推荐,符合Unix时间戳定义)
如果你的预期是UTC时间,直接使用DateTime.UnixEpoch(.NET Core 2.0+、.NET Framework 4.6+支持),它本身就是UTC基准的1970-01-01:
public static DateTime UnixTimeStampToUtcDateTime(long unixTimeStamp) { DateTime utcDateTime = DateTime.UnixEpoch; utcDateTime = utcDateTime.AddSeconds(unixTimeStamp); return utcDateTime; }
用这个方法转换1521932400,会得到2018-03-25 00:00:00(UTC时间),这是该时间戳对应的标准时间。
2. 转换为本地时区时间
如果需要得到你本地时区的正确时间,可以先转成UTC时间,再调用ToLocalTime():
public static DateTime UnixTimeStampToLocalDateTime(long unixTimeStamp) { DateTime utcDateTime = DateTime.UnixEpoch.AddSeconds(unixTimeStamp); return utcDateTime.ToLocalTime(); }
这样转换后,会根据你系统的本地时区自动调整,比如如果你的时区是UTC+8,结果会是2018-03-25 08:00:00。
3. 兼容旧版本.NET Framework(4.5及以下)
如果你的项目用的是较旧的.NET Framework,没有DateTime.UnixEpoch,可以显式指定DateTimeKind.Utc来创建基准时间:
public static DateTime UnixTimeStampToUtcDateTime(long unixTimeStamp) { DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); dtDateTime = dtDateTime.AddSeconds(unixTimeStamp); return dtDateTime; }
验证你的时间戳
1521932400对应的标准UTC时间确实是2018-03-25 00:00:00,你之前得到的24/03/2018 23:00:00是UTC-1时区的本地时间,这也侧面验证了时区是问题的核心。
内容的提问来源于stack exchange,提问作者54566

