数据库中的所有日期/时间数据都以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).
我错过了什么?
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。