使用TimeZoneInfo在UTC /指定的TimeZone之间转换不起作用

时间:2011-10-14 15:15:42

标签: c# time timezone

我们数据库中的所有日期/时间数据都以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日,DST日期)切换到1月11日,这不是DST。

时间似乎总是在DST中显示(即总是偏移7小时)。无论我用我的系统时钟做什么,我都没有时间调整额外的小时。

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

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

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

10-10-2011 12:00:00(-8的偏移量)。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

UTC时间的转换本地时间始终基于 UTC时间的时区信息...而不是当前时间的任何时间。

也就是说,2011年10月10日UTC的PST偏移总是 -7。你转换的日期并不重要。

......或者我误解了你的要求?

答案 1 :(得分:0)

您可以查看 e.Value

将DateTimeKind设置为 DateTimeKind.Utc 还是 DateTimeKind.Unspecified

如果未指定,转换将无法正常运行。

无法直接设置种类。我想出的最好的东西是

// 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);  

希望这有帮助,

艾伦。