【问题标题】:Using TimeZoneInfo to convert between UTC/Specified TimeZone not working使用 TimeZoneInfo 在 UTC/指定时区之间转换不起作用
【发布时间】: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 中的内容。

标签: c# time timezone


【解决方案1】:

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

也就是说,2011 年 10 月 10 日 UTC 的 PST 偏移总是 -7。您在哪一天进行转换并不重要。

...还是我误解了你的意思?

【讨论】:

  • 我想我周五有一个喝咖啡前的时刻。 :)
【解决方案2】:

您可能会查看 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);  

希望对你有帮助,

艾伦。

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 2013-10-23
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2010-11-01
    • 2017-03-17
    相关资源
    最近更新 更多