当两个日期类型都是DateTimeOffset时,将日期从一个时区转换为另一个时区

时间:2015-04-03 02:20:45

标签: c# datetimeoffset

我经常似乎必须在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小提琴来展示我的作品。 https://dotnetfiddle.net/LLl1Za

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

为了让我们拥有上下文,我无法将数据库更改为仅以UTC格式存储数据,只需更改客户端屏幕的区域即可。该项目现在太大而且无法实现这一变化。有很多文章谈论其他时区处理问题,但不是这个具体情况。

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

我没有看到你自己应该实施它的原因。您应该使用TimeZoneInfo.ConvertTime()更改DateTimeOffset的时区。

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