【问题标题】:Converting date from one timezone to another when both date types are DateTimeOffset当两种日期类型均为 DateTimeOffset 时,将日期从一个时区转换为另一个时区
【发布时间】:2015-04-03 02:20:44
【问题描述】:

我似乎经常需要在 DateTimeOffset 中将 DateTimeOffset 值转换为另一个时区。最令人头疼的是 TimeZoneInfo 类转换方法返回 DateTime,因此当我将数据转换为 DateTimeOffset 类型时,我最终不得不再次转换数据。

为了克服这个问题,我想出了一个 DateTimeOffset 的扩展方法:

这必须存在于一个类中。

public static DateTimeOffset ToNewTimeZone(this DateTimeOffset value, string timeZone)
{
    value = value.UtcDateTime;
    TimeZoneInfo tzObject = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
    //Using the GetUtcOffset means that the TimeZoneInfo class is responsible for calculating the Daylight savings time.
    DateTimeOffset ret = value.ToOffset(tzObject.GetUtcOffset(value));
    return ret;
}

它在我提出的每个测试用例下都非常有效,但对我来说似乎不优雅。这通常表明已经有更好的解决方案。但是我还没有找到。

我创建了一个 .NET Fiddle 来展示我的工作。 https://dotnetfiddle.net/LLl1Za

根据我上面的其他实验,第 42 和 43 行突出显示了此代码。

为了让我们有上下文,我不能将数据库更改为仅以 UTC 存储数据,而只能更改客户端屏幕的区域。该项目太大太宽,现在无法进行此更改。有很多文章讨论了其他时区处理问题,但不是这种特定情况。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 以上代码无法编译。 DateTimeOffset ret = ret.ToOffset(tzObject.GetUtcOffset(value)); 是什么意思?
  • 转到dotnetfiddle.net/LLl1Za 并查看第 42 和 43 行。您将确切了解它是如何工作的。我没有将它包装在一个函数中,但我让它在那里工作。
  • @MonroeThomas 因此,当您使用“GetUtcOffset”时,“tzObject”将获取正确的偏移量,包括夏令时规则。因此,当您启动“ToOffset”时,您正在将时间更改为新的偏移量。
  • 留下这个令人尴尬的问题,因为我应该比使用 Bing 更了解,至于谷歌结果,我不知道为什么我现在得到了更好的结果,除非我有一个难看的错字。我还想确保人们得到答案。

标签: c# datetimeoffset


【解决方案1】:

我看不出你应该自己实现它的理由。您应该使用TimeZoneInfo.ConvertTime() 更改DateTimeOffset 的时区。

请参考https://msdn.microsoft.com/en-us/library/bb396765%28v=vs.110%29.aspx

【讨论】:

  • 我自己做的,因为无论我用 Google 搜索或搜索了多少次答案,前 3 页都是除此之外的所有内容。并且 VS 并没有向我展示 2 个对转换的覆盖,只是 DateTime。很高兴我问了。
  • 我只用谷歌搜索过一次:google.com.au/…
猜你喜欢
  • 2015-02-21
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 2019-06-19
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多