安全地比较本地和通用日期时间

jdc*_*589 40 .net c# .net-4.0 datetime-comparison

我刚刚注意到与DateTime比较似乎是一个荒谬的缺陷.

DateTime d = DateTime.Now;
DateTime dUtc = d.ToUniversalTime();

d == dUtc; // false
d.Equals(dUtc); //false
DateTime.Compare(d, dUtc) == 0; // false
Run Code Online (Sandbox Code Playgroud)

似乎DateTimes上的所有比较操作都无法执行任何类型的智能转换(如果一个是DateTimeKind.Local,一个是DateTimeKind.UTC).除了始终将比较中涉及的两者都转换为utc时间之外,这是一种更好的方法来可靠地比较DateTimes吗?

Abe*_*bel 45

编辑,我的原始答案部分不正确:

当你打电话.Equal或者.Compare,在内部.InternalTicks比较价值.这个字段是不相等的,因为它已被调整了几个小时来表示世界时间的时间.您应该这样看:DateTime对象表示未命名时区中的时间,但不是通用时间加时区.时区是Local(系统的时区)或UTC.您可能会认为缺少DateTime类.

转换到另一个时区,时间是-并且应该-调整.这可能是微软选择使用方法而不是属性的原因,以强调转换为UTC时采取的操作.

最初我在这里写道结构被比较,标志System.DateTime.Kind是不同的.事实并非如此:它是不同的刻度数量:

t1.Ticks == t2.Ticks;       // false
t1.Ticks.Equals(t2.Ticks);  // false
Run Code Online (Sandbox Code Playgroud)

要安全地比较两个日期,您可以将它们转换为相同的类型.如果您在比较之前将任何日期转换为通用时间,您将得到您之后的结果:

DateTime t1 = DateTime.Now;
DateTime t2 = t1;
DateTime.Compare(t1.ToUniversalTime(), t2.ToUniversalTime());  // 0
DateTime.Equals(t1.ToUniversalTime(), t2.ToUniversalTime());  // true
Run Code Online (Sandbox Code Playgroud)

道德:从不比较DateTime天真

  • 有人可以为DateTime证明这种行为吗?我想我只是不明白.为什么直接比较不考虑时区?这对我来说似乎有缺陷. (4认同)

Ed *_*tes 5

为了解决这个问题,我创建了自己的DateTime对象(让我们称之为SmartDateTime),其中包含DateTime和TimeZone.在使用原始DateTime运算符进行比较之前,我覆盖所有运算符,如==和比较并转换为UTC.

  • 啊.您可能最好只在数据库中添加TimeZoneInfo字段并以UTC格式存储所有日期. (3认同)