我们数据库中的所有日期/时间数据都以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的偏移量)。
我错过了什么?
答案 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);
希望这有帮助,
艾伦。