我经常似乎必须在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格式存储数据,只需更改客户端屏幕的区域即可。该项目现在太大而且无法实现这一变化。有很多文章谈论其他时区处理问题,但不是这个具体情况。
有更好的方法吗?
答案 0 :(得分:2)
我没有看到你自己应该实施它的原因。您应该使用TimeZoneInfo.ConvertTime()
更改DateTimeOffset
的时区。
请参阅https://msdn.microsoft.com/en-us/library/bb396765%28v=vs.110%29.aspx