以下是代码:
var date = DateTime.Now.Date;
var ms = (long)(date - DateTimeOffset.UnixEpoch).TotalMilliseconds;
var date1 = DateTimeOffset.FromUnixTimeMilliseconds(ms).DateTime.Date;
date是24号,而date1是23号
为什么它们不匹配?
使用 DateTimeOffset.FromUnixTimeMilliseconds(ms).LocalDateTime
。
DateTime.Now
的 Kind = 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;
date
和date1
之间的天数不足以使您在冬令时/夏令时之间切换)。.LocalDateTime
之后加上.Date
,因为日期应该已经是00:00:00
)。.Date
可以将时间设置为00:00。 - xanatosDateTime.Now.Date
-- .Date
很重要,因为它给你一个代表当天午夜的 DateTime
。 - canton7DateTimeOffset
(只有极少数情况不适用),对于那些 DateTimeOffset
无法胜任的情况,考虑使用类似 NodaTime 的东西。 - canton7
DateTime.Now
是以您的本地时区为基础的。DateTimeOffset.UnixEpoch
是以 UTC 为基础的。执行date - DateTimeOffset.UnixEpoch
将进行时区转换,因此ms
给出了自 UNIX 纪元(UTC)到您本地时区的“现在”之间的秒数。目前为止都很好。DateTimeOffset.FromUnixTimeMilliseconds(ms)
会给您提供一个以 UTC 为基础的DateTimeOffset
,所以date1
将是以 UTC 而不是您的本地时区为基础的。由此可知,您必须比 UTC 时间提前? - canton7