【发布时间】:2019-06-27 11:59:21
【问题描述】:
以下 d,e,f 值之间的真正区别是什么? 'ToUniversalTime()' 的真正作用是什么?
var d = DateTime.Now;
var e = d.ToUniversalTime();
var f = e;
有人知道吗?谢谢。
备注:当 'Created' 字段是日期时间 sql 字段并且包含 UTC 时间时,我们在 EF 查询中检测到差异:
var itemsD = ctx.Log.Where(p => p.Created > d);
var itemsE = ctx.Log.Where(p => p.Created > e);
【问题讨论】:
-
看起来实际问题是“如何对存储为 UTC 的日期执行查询?”。与
ToUniversalTime()无关。使用DateTime.UtcNow或DateTime.Now.ToUniversalTime()获取值,而不是DateTime.Now -
@ZoltanHernyak:.NET 中没有
Date数据类型。只有DateTime。如果日期时间包含2019-01-02 00:00,您的本地时区是UTC+2,并且您执行ToUniveralTime,结果将是2019-01-01 22:00。 -
@ZoltanHernyak:我明白你的意思,
var d = DateTimeOffset.Now; return d == d.ToUniversalTime()实际上返回 true。不幸的是,旧的DateTime数据类型并非如此,它不存储时区偏移信息,而只是一些模糊的“种类”。 -
@ZoltanHernyak:“所以 .ToUniversalTime() 对日期时间值没有任何作用(不会改变含义)”——仅适用于
DateTimeOffset,不适用于 @987654335 @!请注意,有不同的数据类型:.NET 的DateTimeOffset和 SQL Server 的datetimeoffset可识别时区,存储“绝对时间点”并按照您的预期行事:将它们转换为 UTC 确实 不更改基础时间点。但是,.NET 的DateTime和 SQL 的datetime/datetime2不同:它们不存储“绝对时间点”,而是存储“日历时间”。 -
@ZoltanHernyak:如果您还没有看到,请查看此问题了解更多详情:stackoverflow.com/q/4331189/87698