【问题标题】:Convert DateTime from UTC to a user provided time zone with C#使用 C# 将 DateTime 从 UTC 转换为用户提供的时区
【发布时间】:2012-07-24 02:55:52
【问题描述】:

假设我有一个数据库列,其中包含 UTC 时区的日期/时间,我可以将它们读入我用 C# 编写的 ASP.NET Web 应用程序中的 DateTime 对象中。如何将它们转换为用户提供的时区?

【问题讨论】:

    标签: c# asp.net datetime timezone


    【解决方案1】:

    这假设time 有一个Kind = DateTimeKind.Utc

    你可以使用ConvertTimeFromUtc:

    TimeZoneInfo.ConvertTimeFromUtc(time, userTimeZone);
    

    TimeZoneInfo.ConvertTime:

    TimeZoneInfo.ConvertTime(time, TimeZoneInfo.Utc, userTimeZone);
    

    您可能需要查看 TimeZoneInfo.ConvertTime 上的 MSDN 文章,了解该方法的详细信息。

    关于converting between time zones on MSDN 的所有内容可能也值得一读。它比您想象的要复杂。

    【讨论】:

    • 非常感谢!一个后续问题。如果我想存储一个时区列表供用户选择,TimeZoneInfo 的哪个属性最好存储在 DropDownCtrl 值中?
    • 似乎时区的 ID 是一个合理的属性
    • 我唯一担心的是 ID 是一个字符串,类似于“太平洋标准时间(墨西哥)”,而不仅仅是一个数字。我有点担心本地化?
    • 啊,好吧。在这种情况下,BaseUtcOffset.TotalHours 可能会起作用。
    • 再次感谢。应该这样做。
    【解决方案2】:

    要在系统中获取时区列表,您可以使用 TimeZoneInfo.GetSystemTimeZones() 。它将 为您的系统提供所有可用时区的列表。

          List<TimeZoneInfo>  lstTZI = TimeZoneInfo.GetSystemTimeZones().ToList(); 
    

    因为它是 ReadOnlyCollection 。现在您可以将此源与 DropDownCntrl 绑定。

    【讨论】:

    • 不错的补充。谢谢。只是好奇,有没有办法在用户的网络浏览器中选择时区?
    • 使用 TimeZone.CurrentTimeZone 获取当前时区,并使用列表 lstTZI 中的标准名称找到它。
    猜你喜欢
    • 2021-02-14
    • 2011-02-02
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2011-02-11
    相关资源
    最近更新 更多