【发布时间】: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