System.TimeZoneInfo.GetSystemTimeZones 方法

方法描述

返回时区信息在本地系统上可用的所有时区的已排序集合。

语法定义(C# System.TimeZoneInfo.GetSystemTimeZones 方法 的用法)

public static ReadOnlyCollection GetSystemTimeZones()

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
返回值 System.Collections.ObjectModel.ReadOnlyCollection TimeZoneInfo 对象的只读集合。

提示和注释

GetSystemTimeZones 方法从注册表 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones 项的子项检索所有可用的时区信息。 如果无法成功检索并分析各个 TimeZoneInfo 对象的特定字符串属性值,则此方法将这些值设置为空字符串 ("")。

重要事项

GetSystemTimeZones 方法只为在注册表中定义的时区返回 TimeZoneInfo 对象的集合, 而不包括使用 CreateCustomTimeZone 方法重载创建的时区。 只能通过由时区创建方法返回的对象引用访问这些时区。

此方法返回的集合使用当前区域性按显示名称排序。 有关显示名称的信息,请参见 DisplayName。

此方法返回的 ReadOnlyCollection 对象支持 IEnumerable 接口,这表示可以使用 foreach(在 C# 中)或 For Each…Next(在 Visual Basic 中)语句对该对象进行迭代。 每次循环迭代提供集合中的下一个 TimeZoneInfo 对象。

TimeZoneInfo 对象的集合表示在本地计算机上定义的时区;它不一定提供所有时区在所有期间的完整信息。 如果在本地计算机上找不到应用程序所需要的时区,则可以使用 CreateCustomTimeZone 方法重载创建自定义时区。 有关更多信息,请参见如何:创建不带调整规则的时区和如何:创建带有调整规则的时区。

您还可以通过调用 FindSystemTimeZoneById 方法并提供您要检索的时区的标识符作为参数,来确定是否在本地计算机上定义单个时区。

System.TimeZoneInfo.GetSystemTimeZones 方法例子

下面的示例检索表示时区已在计算机上定义的时区对象的集合,并将相关信息写入文本文件。

using System;
using System.Globalization;
using System.IO;
using System.Collections.ObjectModel;

public class Example
{
   public static void Main()
   {
      const string OUTPUTFILENAME = @"C:\Temp\TimeZoneInfo.txt";

      DateTimeFormatInfo dateFormats = CultureInfo.CurrentCulture.DateTimeFormat;
      ReadOnlyCollection timeZones = TimeZoneInfo.GetSystemTimeZones(); 
      StreamWriter sw = new StreamWriter(OUTPUTFILENAME, false);

      foreach (TimeZoneInfo timeZone in timeZones)
      {
         bool hasDST = timeZone.SupportsDaylightSavingTime;
         TimeSpan offsetFromUtc = timeZone.BaseUtcOffset;
         TimeZoneInfo.AdjustmentRule[] adjustRules;
         string offsetString;

         sw.WriteLine("ID: {0}", timeZone.Id);
         sw.WriteLine("   Display Name: {0, 40}", timeZone.DisplayName);
         sw.WriteLine("   Standard Name: {0, 39}", timeZone.StandardName);
         sw.Write("   Daylight Name: {0, 39}", timeZone.DaylightName);
         sw.Write(hasDST ? "   ***Has " : "   ***Does Not Have ");
         sw.WriteLine("Daylight Saving Time***");
         offsetString = String.Format("{0} hours, {1} minutes", offsetFromUtc.Hours, offsetFromUtc.Minutes);
         sw.WriteLine("   Offset from UTC: {0, 40}", offsetString);
         adjustRules = timeZone.GetAdjustmentRules();
         sw.WriteLine("   Number of adjustment rules: {0, 26}", adjustRules.Length);  
         if (adjustRules.Length > 0)
         {
            sw.WriteLine("   Adjustment Rules:");
            foreach (TimeZoneInfo.AdjustmentRule rule in adjustRules)
            {
               TimeZoneInfo.TransitionTime transTimeStart = rule.DaylightTransitionStart;
               TimeZoneInfo.TransitionTime transTimeEnd = rule.DaylightTransitionEnd; 

               sw.WriteLine("      From {0} to {1}", rule.DateStart, rule.DateEnd);
               sw.WriteLine("      Delta: {0}", rule.DaylightDelta);
               if (! transTimeStart.IsFixedDateRule)
               {
                  sw.WriteLine("      Begins at {0:t} on {1} of week {2} of {3}", transTimeStart.TimeOfDay, 
                                                                                transTimeStart.DayOfWeek,                                                                                 
                                                                                transTimeStart.Week, 
                                                                                dateFormats.MonthNames[transTimeStart.Month - 1]);
                  sw.WriteLine("      Ends at {0:t} on {1} of week {2} of {3}", transTimeEnd.TimeOfDay,
                                                                                transTimeEnd.DayOfWeek, 
                                                                                transTimeEnd.Week,
                                                                                dateFormats.MonthNames[transTimeEnd.Month - 1]);
               }
               else
               {
                  sw.WriteLine("      Begins at {0:t} on {1} {2}", transTimeStart.TimeOfDay, 
                                                                 transTimeStart.Day, 
                                                                 dateFormats.MonthNames[transTimeStart.Month - 1]);
                  sw.WriteLine("      Ends at {0:t} on {1} {2}", transTimeEnd.TimeOfDay, 
                                                               transTimeEnd.Day, 
                                                               dateFormats.MonthNames[transTimeEnd.Month - 1]);
               }
            }
         }            
      }
      sw.Close();
   }
}

异常

异常 异常描述
OutOfMemoryException 内存不足,无法存储所有时区信息。
SecurityException 用户没有读取包含时区信息的注册表项所需的权限。

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

版本信息

.NET Framework 受以下版本支持:4、3.5 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。