【问题标题】:How to convert a DateTimeOffset to another time zone如何将 DateTimeOffset 转换为另一个时区
【发布时间】:2020-12-28 06:58:17
【问题描述】:

假设source 是任意的DateTimeOffset,我想将变量dest(也是DateTimeOffset 类型)分配给纽约的同一时间点,并具有适当的偏移量。以下代码似乎可以做到这一点:

var utcSource = source.ToUniversalTime();
var destZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var destDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcSource.DateTime, destZone);
var destZoneOffset = destZone.GetUtcOffset(destDateTime);
var dest = new DateTimeOffset(destDateTime, destZoneOffset);

我的问题:有没有更简单的方法?对于一个非常常见的要求,这似乎是很多代码,特别是因为对于大多数用例,DateTimeOffset 优于 DateTime。 (我意识到如果我只使用DateTime,代码会更简单。)

【问题讨论】:

标签: .net date timezone


【解决方案1】:

正如 Pavel 在问题的 cmets 中指出的那样,您可以在一行中执行以下操作:

DateTimeOffset dest = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(source, "Eastern Standard Time");

或者,如果您已经有一个 TimeZoneInfo 对象作为目的地,那么请执行以下操作:

DateTimeOffset dest = TimeZoneInfo.ConvertTime(source, destZone);

当然,如果您愿意,可以使用var

几点:

  • 注意source 确实是DateTimeOffset。如果它实际上是DateTime,那么源值的.Kind 属性将以可能不明显的方式影响操作。每种转换方法的文档都包含一个描述此行为的表格,每种方法都相同。

  • DateTimeOffset.DateTime 属性返回具有 DateTimeKind.Unspecified 种类的 DateTimeConvertTimeFromUtc 将被视为 UTC,但如果您无意中使用了 ConvertTime - 那么未指定将被视为 本地 时间。所以要小心。

  • 还要注意从DateTimeDateTimeOffset 的单向隐式转换,其中考虑了.Kind。如果您使用DateTime 进行转换,但随后将结果分配给DateTimeOffset,这可能是一个问题。你不在这里,但这是另一个需要注意的常见错误。

【讨论】:

  • 谢谢...总结是...避免DateTime!
  • 实际上 - 没有。这是一种常见的反应,但是DateTime 有许多有效的用例DateTimeOffset 不能很好地使用。特别是,DateTimeOffset总是代表一个特定的时间点,但有时您确实需要它是“未指定的”。这是一个很好的概述:docs.microsoft.com/en-us/dotnet/standard/datetime/…
猜你喜欢
  • 2020-10-07
  • 1970-01-01
  • 2012-10-27
  • 2019-04-14
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 2015-05-06
  • 2015-10-16
相关资源
最近更新 更多