使用TimeZoneInfo在UTC/指定时区之间转换不工作

本文关键字:之间 转换 工作 定时区 TimeZoneInfo UTC 使用 | 更新日期: 2023-09-27 18:11:20

数据库中的所有日期/时间数据都以UTC时间存储。我正试图编写一个函数将UTC时间转换为用户的首选时区(他们可以在他们的配置文件中选择他们的时区,因此它与计算机上的本地设置无关,与他们从可用选项的下拉菜单中选择的时区有关。

这个函数是在DevExpress AspxGridView事件的上下文中(第三方控件与问题无关,但我想我会提到它):

DateTimeOffset utcTime = (DateTimeOffset)e.Value;
TimeZoneInfo destTimeZone = Helper.GetTimeZoneInfo();
DateTime modifiedDate = TimeZoneInfo
    .ConvertTimeFromUtc(utcTime.DateTime, destTimeZone);
e.DisplayText = String.Format("{0} {1}", 
                              modifiedDate.ToString("g"), 
                              destTimeZone.Abbreviation());

Helper.GetTimeZoneInfo()只是返回一个TimeZoneInfo类,该类对应于用户选择的时间,如果用户没有选择时间,则默认为"太平洋标准时间"。

在我将系统时钟(服务器运行的时间)从今天(夏时制日期10月14日)切换到1月11日(非夏时制日期)之前,这通常工作得很好。

时间似乎总是显示在DST(即总是一个7小时的偏移)。不管我怎么调整我的生物钟,我都没有时间去适应多出来的一个小时。

例如,当我将时区设置为太平洋标准时间时,对于UTC时间10-10-2011 20:00:00,总是显示此时间:

2010-10-2011 13:00:00 (DST时间,偏移量-7).

在非夏令时日期(标准)期间,时间应为:

2010-10-2011 12:00:00 (offset of -8).

我错过了什么?

使用TimeZoneInfo在UTC/指定时区之间转换不工作

UTC时间转换后的本地时间总是基于该UTC时间的时区信息…不管当前时间是什么

即2011年10月10日UTC的PST偏移量总是 -7。无论你在什么日期进行转换,

…还是我误解了你的问题?

您可以看一下e.Value

是设置为DateTimeKind的DateTimeKind。Utc还是DateTimeKind。未指明的

如果未指定,转换将不能正常工作。

不能直接设置类型。我能想到的最好的办法就是这样写

// the value off the DB, but Kind is unspecified
var fromDb = new DateTime(1999,31,12)         
// convert it to a Utc version of the same date
var fromDbInUtc = new DateTime(fromDb.Ticks, DateTimeKind.Utc)
var destTimeZone = Helper.GetTimeZoneInfo();     
var local = TimeZoneInfo.ConvertFromUtc(fromDbInUtc, destTimeZone);  

希望有帮助,

Alan。