【问题标题】:Finding time zone of Ireland using TimeZoneInfo object使用 TimeZoneInfo 对象查找爱尔兰的时区
【发布时间】:2011-07-14 09:30:06
【问题描述】:

我需要获取 (IST) 爱尔兰标准时间的 TimeZoneInfo。我执行了以下语句,但以异常结束。我在这里做错了什么?

TimeZoneInfo tmz = TimeZoneInfo.FindSystemTimeZoneById("Ireland Standard Time");

异常说

在本地找不到时区 ID“爱尔兰标准时间” 电脑。

【问题讨论】:

  • 异常与您的代码不匹配。 “爱尔兰”“爱尔兰”。那么你真正的代码或真正的异常消息是什么?
  • 感谢您指出已编辑的内容。
  • 那么...尝试正确的名称:“爱尔兰标准时间”。但至少在我的机器上,它也找不到。根据documentation,注册表中的时区列表不完整。
  • 我相信你应该寻找western europe standard time,这是爱尔兰所在的地方

标签: c#


【解决方案1】:

爱尔兰的时区 ID 是“GMT 标准时间”。这个适用于我的 TimeZoneInfo.FindSystemTimeZoneById 一个 Windows 7。

【讨论】:

    【解决方案2】:

    似乎没有这样的时区。

    您可以使用GetSystemTimeZones 方法获取时区。我使用了这段代码:

    foreach (var zone in TimeZoneInfo.GetSystemTimeZones()) {
      Console.WriteLine("{0:00.00} {1}", zone.BaseUtcOffset.TotalHours, zone.Id);
    }
    

    列表中间是您可能感兴趣的时区:

    ...
    -01,00 Azores Standard Time
    -01,00 Cape Verde Standard Time
    00,00 Morocco Standard Time
    00,00 UTC
    00,00 GMT Standard Time
    00,00 Greenwich Standard Time
    01,00 W. Europe Standard Time
    01,00 Central Europe Standard Time
    01,00 Romance Standard Time
    01,00 Central European Standard Time
    01,00 W. Central Africa Standard Time
    01,00 Namibia Standard Time
    ...
    

    【讨论】:

      【解决方案3】:

      我猜你得到了一个 TimeZoneNotFoundException

      未找到 id 指定的时区标识符。这表示 名称与 id 匹配的注册表项不存在,或者 键存在但不包含任何时区数据。

      Link to msdn

      使用的注册表项是:

      HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time 区域

      【讨论】:

        【解决方案4】:

        TimeZoneInfo 支持的时区列表在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 中。我的 Windows 7 副本没有任何爱尔兰信息。

        【讨论】:

          【解决方案5】:

          来自 MSDN:

          FindSystemTimeZoneById 尝试将 id 与 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones 的子项名称匹配

          在我的本地电脑(Windows 7)上,我没有找到 ID“爱尔兰标准时间”

          MSDN TimeZoneInfo

          【讨论】:

            【解决方案6】:

            msdn复制的示例

            运行它以查看您可以使用的时区 ID:

            ReadOnlyCollection<TimeZoneInfo> zones = TimeZoneInfo.GetSystemTimeZones();
            Console.WriteLine("The local system has the following {0} time zones", zones.Count);
            foreach (TimeZoneInfo zone in zones)
               Console.WriteLine(zone.Id);
            

            【讨论】:

              【解决方案7】:

              我试图在 VB.NET 中找到这个解决方案。感谢https://msdn.microsoft.com/en-us/library/bb397784(v=vs.110).aspx 的代码,我找到了解决方案。希望这将使您达到只需要一个好的 VB.NET 到 C# 转换器来结束这个 5 年前的问题的地步。

              Dim IST As TimeZoneInfo
              ' Declare necessary TimeZoneInfo.AdjustmentRule objects for time zone
              ' delta is the amount of change during DST
              Dim delta As New TimeSpan(1, 0, 0)
              Dim adjustment As TimeZoneInfo.AdjustmentRule
              Dim adjustmentList As New List(Of TimeZoneInfo.AdjustmentRule)
              ' Declare transition time variables to hold transition time information
              Dim transitionRuleStart, transitionRuleEnd As TimeZoneInfo.TransitionTime
              
              ' Simplifying some elements for later use
              Dim CurrTime As Date = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Unspecified)
              Dim EST As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
              Dim CST As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")
              Dim UTC As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("UTC")
              
              ' Define new Irish Standard Time zone at UTC, but with DST
              transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00 AM#, 3, 2, DayOfWeek.Sunday)
              transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00 AM#, 11, 1, DayOfWeek.Sunday)
              adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#1/1/2007#, Date.MaxValue.Date, delta, transitionRuleStart, transitionRuleEnd)
              adjustmentList.Add(adjustment)
              
              Dim adjustments(adjustmentList.Count - 1) As TimeZoneInfo.AdjustmentRule
              adjustmentList.CopyTo(adjustments)
              
              IST = TimeZoneInfo.CreateCustomTimeZone("IST", New TimeSpan(0, 0, 0), _
                    "(GMT 00:00) Irish Standard Time (Ireland)", "Irish Standard Time", _
                    "Irish Daylight Time", adjustments)
              
              ' Testing.
              Debug.Print("Time in Ireland: " & TimeZoneInfo.ConvertTime(CurrTime, UTC, IST))
              Debug.Print("Time in New York: " & TimeZoneInfo.ConvertTime(CurrTime, UTC, EST))
              Debug.Print("Time in Chicago: " & TimeZoneInfo.ConvertTime(CurrTime, UTC, CST))
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-11-27
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多