C#转换到Unix和从Unix转换时间-损失1天

C#转换到Unix和从Unix转换时间-损失1天,c#,.net-core,C#,.net Core,代码如下: var date = DateTime.Now.Date; var ms = (long)(date - DateTimeOffset.UnixEpoch).TotalMilliseconds; var date1 = DateTimeOffset.FromUnixTimeMilliseconds(ms).DateTime.Date; 日期是24日,日期1是23日 为什么它们不匹配?使用DateTimeOffset.fromUnixtimemilures(ms).LocalDate

代码如下:

var date = DateTime.Now.Date;
var ms = (long)(date - DateTimeOffset.UnixEpoch).TotalMilliseconds;
var date1 = DateTimeOffset.FromUnixTimeMilliseconds(ms).DateTime.Date;
日期是24日,日期1是23日


为什么它们不匹配?

使用
DateTimeOffset.fromUnixtimemilures(ms).LocalDateTime

DateTime。现在
具有
Kind=Local
,因此它正在减小UTC偏移量

您可以通过以下方式查看:

var kind = DateTime.Now.Date.Kind;
然后你可以用“种类”做一个小测试:

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

因此,您的
ms
包括UTC偏移量。现在你必须:

var date1 = DateTimeOffset.FromUnixTimeMilliseconds(ms).LocalDateTime;
希望您仍然处于“原始”utc偏移量(因此在计算
date
和计算
date1
之间没有足够的天数供您在冬季/夏季之间切换)


(如果你做的一切都正确,你就不需要在
.LocalDateTime
之后加上
.Date
,因为日期应该已经是
00:00:00

可能是时区<代码>日期。现在在您的
本地
时区<代码>日期时间偏移量。UnixEpoch以UTC为单位。执行
date-DateTimeOffset.UnixEpoch
将执行时区转换,以便
ms
给出从unix历元(UTC)到本地时区中“现在”的秒数。到目前为止一切都很好<代码>日期时间偏移量。FromUnixtimeMissions(ms)提供UTC中的
DateTimeOffset
,因此
date1
将使用UTC,而不是本地时区。从这一点上,我们推断您必须领先UTC?是的,谢谢您的解释您所说的-它起作用了。但我不明白为什么。我离UTC..@BoppityBop只有2个小时,这两个小时将前一天的00:00时间推到22:00时间。C#中没有“纯日期”类型。使用
.Date
只需将时间设置为00:00。@BoppityBop准确无误。别忘了你正在做的
DateTime.Now.Date
——这
.Date
很重要,因为它给了你一个
DateTime
,表示问题中一天的午夜是一个咆哮,DateTime中的类信息是他们在.NET 1.0中提出的最糟糕的想法之一,遗憾的是我们不得不保留它。我只见过它破坏东西,我从来没有见过它是有用的东西。在可能的情况下使用<代码> DATEMEMPLOS/<代码>(只有很少的情况下使用它是没有意义的),并且考虑代码“> DeTeMePosiff不切断它的情况下,像NodoTime之类的东西。
var date1 = DateTimeOffset.FromUnixTimeMilliseconds(ms).LocalDateTime;