首页 > 解决方案 > C# 与 Unix 时间之间的转换 - 丢失 1 天

问题描述

这是代码:

var date = DateTime.Now.Date;
var ms = (long)(date - DateTimeOffset.UnixEpoch).TotalMilliseconds;
var date1 = DateTimeOffset.FromUnixTimeMilliseconds(ms).DateTime.Date;

日期是 24 日,日期 1 是 23 日

为什么他们不匹配?

标签: c#.net-core

解决方案


使用DateTimeOffset.FromUnixTimeMilliseconds(ms).LocalDateTime.

DateTime.NowKind = Local所以它会扭曲你的 UTC 偏移量。

你可以看到它:

var kind = DateTime.Now.Date.Kind;

然后你可以用“kind”做一个小测试:

var date = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local);
var ms = (long)(date - DateTimeOffset.UnixEpoch).TotalMilliseconds;

多少钱ms?根据冬季/夏季时间和您所在的位置,它可能不是 0。

所以你ms包括你的UTC偏移量。现在你必须:

var date1 = DateTimeOffset.FromUnixTimeMilliseconds(ms).LocalDateTime;

并且希望您仍然处于“原始” UTC 偏移量(因此在计算date和计算之间没有足够的天数date1让您在冬季/夏季时间之间切换)

(如果你做的一切都正确,你真的不需要.Dateafter .LocalDateTime,因为日期应该已经是00:00:00


推荐阅读