【问题标题】:What does .ToUniversalTime() really do on a DateTime instance (C#)?.ToUniversalTime() 在 DateTime 实例 (C#) 上真正做了什么?
【发布时间】: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.UtcNowDateTime.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

标签: c# datetime utc


【解决方案1】:

“ToUniversalTime”方法返回的值由当前 DateTime 对象的“Kind”属性决定。下面描述了可能的结果:

Kind: Utc 

结果:没有执行转换。

Kind: Local. 

结果:当前的 DateTime 对象被转换为 UTC。

Kind: Unspecified. 

结果:当前的 DateTime 对象被假定为本地时间,并且按照 Kind 是 Local 的方式执行转换。

默认为未指定。

ToUniversalTime 方法将 DateTime 值从本地时间转换为 UTC。要将非本地时区的时间转换为 UTC,请使用 TimeZoneInfo.ConvertTimeToUtc(DateTime, TimeZoneInfo) 方法。要转换与 UTC 的偏移量已知的时间,请使用 ToUniversalTime 方法。

【讨论】:

  • 如果我理解得很好,d.Kind 是本地的,e.Kind 是UTC。由于从基本时刻经过的“滴答声”可以重新表示日期时间,因此值应该随着种类的变化而变化,但是 d==e 相等(以非常严格的方式)仍然是正确的,是吗?那为什么我需要将'd'转换为utc表示'e'?
  • 如果你在匈牙利,那么你的时区是 (UTC +2),这意味着你的 "d" = (UTC +2)。因为“e”是“d”到(UTC)的转换,所以“e”=(UTC)。因为“f”=“e”,所以“f”和“e”都=(UTC)。我的时区 = CEST,所以我的 "e" 和 "f" = (28/06/2019 06.12.56),但我的 d = (28/06/2019 08.12.56)。
【解决方案2】:

ToUniversalTime 方法将本地小时的 DateTime 值转换为 UTC 小时。 如果要转换已知 UTC 值的时间值,可以使用此方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2021-09-08
    相关资源
    最近更新 更多