【发布时间】:2011-12-07 20:35:12
【问题描述】:
我们数据库中的所有日期/时间数据均以 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)。
我错过了什么?
【问题讨论】:
-
听起来你应该能够在一个简短但完整的控制台应用程序中演示这一点 - 这会让其他人更容易帮助你。你能用一个合适的例子来编辑你的问题吗?您检索到的
DateTimeOffset中的偏移量是多少?我注意到您目前正在将其丢弃,这并不理想。 -
(哦,如果您有兴趣调查Noda Time 是否会让您的生活在这里变得更简单,我很乐意帮助您:)
-
两种情况下e.Value的值是多少?
-
当我使用 10-10-2011 20:00:00 的示例时,我在底部间接提到了这一点。这将代表 e.Value 中的内容。