Поделиться через


TimeZoneInfo.GetSystemTimeZones Метод

Определение

Перегрузки

GetSystemTimeZones()

Возвращает отсортированную коллекцию всех часовых поясов, сведения о которых доступны в локальной системе.

GetSystemTimeZones(Boolean)

Возвращает объект , ReadOnlyCollection<T> содержащий все допустимые часовые пояса с локального компьютера. Этот метод не вызывает исключение TimeZoneNotFoundException или InvalidTimeZoneException.

GetSystemTimeZones()

Исходный код:
TimeZoneInfo.cs
Исходный код:
TimeZoneInfo.cs
Исходный код:
TimeZoneInfo.cs

Возвращает отсортированную коллекцию всех часовых поясов, сведения о которых доступны в локальной системе.

public:
 static System::Collections::ObjectModel::ReadOnlyCollection<TimeZoneInfo ^> ^ GetSystemTimeZones();
public static System.Collections.ObjectModel.ReadOnlyCollection<TimeZoneInfo> GetSystemTimeZones ();
[System.Security.SecurityCritical]
[System.Security.SecurityTreatAsSafe]
public static System.Collections.ObjectModel.ReadOnlyCollection<TimeZoneInfo> GetSystemTimeZones ();
static member GetSystemTimeZones : unit -> System.Collections.ObjectModel.ReadOnlyCollection<TimeZoneInfo>
[<System.Security.SecurityCritical>]
[<System.Security.SecurityTreatAsSafe>]
static member GetSystemTimeZones : unit -> System.Collections.ObjectModel.ReadOnlyCollection<TimeZoneInfo>
Public Shared Function GetSystemTimeZones () As ReadOnlyCollection(Of TimeZoneInfo)

Возвращаемое значение

Доступная только для чтения коллекция объектов TimeZoneInfo.

Атрибуты

Исключения

Недостаточно памяти для хранения всех сведений о часовом поясе.

Пользователь не имеет разрешений на чтение из разделов реестра, которые содержат сведения о часовом поясе.

Примеры

В следующем примере извлекается коллекция объектов часовых поясов, представляющих часовые пояса, определенные на компьютере, и записывается информация о них в текстовый файл.

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<TimeZoneInfo> 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();
   }
}
open System
open System.Globalization
open System.IO
open System.Collections.ObjectModel

[<EntryPoint>]
let main _ =
    let OUTPUTFILENAME = @"C:\Temp\TimeZoneInfo.txt"

    let dateFormats = CultureInfo.CurrentCulture.DateTimeFormat
    let timeZones = TimeZoneInfo.GetSystemTimeZones() 
    use sw = new StreamWriter(OUTPUTFILENAME, false)

    for timeZone in timeZones do
        let hasDST = timeZone.SupportsDaylightSavingTime
        let offsetFromUtc = timeZone.BaseUtcOffset
    
        sw.WriteLine $"ID: {timeZone.Id}"
        sw.WriteLine $"   Display Name: {timeZone.DisplayName, 40}"
        sw.WriteLine $"   Standard Name: {timeZone.StandardName, 39}"
        sw.Write $"   Daylight Name: {timeZone.DaylightName, 39}"
        sw.Write(if hasDST then "   ***Has " else "   ***Does Not Have ")
        sw.WriteLine "Daylight Saving Time***"
        let offsetString = $"{offsetFromUtc.Hours} hours, {offsetFromUtc.Minutes} minutes"
        sw.WriteLine $"   Offset from UTC: {offsetString, 40}"
        let adjustRules = timeZone.GetAdjustmentRules()
        sw.WriteLine $"   Number of adjustment rules: {adjustRules.Length, 26}"
        if adjustRules.Length > 0 then
            sw.WriteLine "   Adjustment Rules:"
            for rule in adjustRules do
                let transTimeStart = rule.DaylightTransitionStart
                let transTimeEnd = rule.DaylightTransitionEnd 
            
                sw.WriteLine $"      From {rule.DateStart} to {rule.DateEnd}"
                sw.WriteLine $"      Delta: {rule.DaylightDelta}"
                if not transTimeStart.IsFixedDateRule then
                    sw.WriteLine $"      Begins at {transTimeStart.TimeOfDay:t} on {transTimeStart.DayOfWeek} of week {transTimeStart.Week} of {dateFormats.MonthNames[transTimeStart.Month - 1]}"
                    sw.WriteLine $"      Ends at {transTimeEnd.TimeOfDay:t} on {transTimeEnd.DayOfWeek} of week {transTimeEnd.Week} of {dateFormats.MonthNames[transTimeEnd.Month - 1]}"
                else
                    sw.WriteLine $"      Begins at {transTimeStart.TimeOfDay:t} on {transTimeStart.Day} {dateFormats.MonthNames[transTimeStart.Month - 1]}"
                    sw.WriteLine $"      Ends at {transTimeEnd.TimeOfDay:t} on {transTimeEnd.Day} {dateFormats.MonthNames[transTimeEnd.Month - 1]}"
    0
Imports System.Collections.ObjectModel
Imports System.Globalization
Imports System.IO

Module Example
   Public Sub Main()
      Const OUTPUTFILENAME As String = "C:\Temp\TimeZoneInfo.txt"
      
      Dim timeZones As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones() 
      Dim sw As StreamWriter = New StreamWriter(OUTPUTFILENAME, False)
      
      For Each timeZone As TimeZoneInfo in timeZones
         Dim hasDST As Boolean = timeZone.SupportsDaylightSavingTime
         Dim offsetFromUtc As TimeSpan = timeZone.BaseUtcOffset
         Dim adjustRules() As System.TimeZoneInfo.AdjustmentRule
         Dim offsetString As String
         
         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(iif(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 Then
            sw.WriteLine("   Adjustment Rules:")
            For Each rule As TimeZoneInfo.AdjustmentRule In adjustRules
               Dim transTimeStart As TimeZoneInfo.TransitionTime = rule.DaylightTransitionStart
               Dim transTimeEnd As TimeZoneInfo.TransitionTime = rule.DaylightTransitionEnd 
               
               sw.WriteLine("      From {0} to {1}", rule.DateStart, rule.DateEnd)
               sw.WriteLine("      Delta: {0}", rule.DaylightDelta)
               If Not transTimeStart.IsFixedDateRule
                  sw.WriteLine("      Begins at {0:t} on {1} of week {2} of {3}", transTimeStart.TimeOfDay, _
                                                                                transTimeStart.DayOfWeek, _
                                                                                transTimeStart.Week, _
                                                                                MonthName(transTimeStart.Month))
                  sw.WriteLine("      Ends at {0:t} on {1} of week {2} of {3}", transTimeEnd.TimeOfDay, _
                                                                                transTimeEnd.DayOfWeek, _
                                                                                transTimeEnd.Week, _
                                                                                MonthName(transTimeEnd.Month))
               Else
                  sw.WriteLine("      Begins at {0:t} on {1} {2}", transTimeStart.TimeOfDay, _
                                                                 transTimeStart.Day, _
                                                                 MonthName(transTimeStart.Month))
                  sw.WriteLine("      Ends at {0:t} on {1} {2}", transTimeEnd.TimeOfDay, _
                                                               transTimeEnd.Day, _
                                                               MonthName(transTimeEnd.Month))
               End If
            Next
         End If            
      Next
      sw.Close()
#  Get timezone/date details and open a stream writer
$DateFormats    = [System.Globalization.CultureInfo]::CurrentCulture.DateTimeFormat
$TimeZones      = [System.TimeZoneInfo]::GetSystemTimeZones()
$OutputFileName = 'C:\Temp\TimeZoneInfo.txt'
$Sw             = New-Object -TypeName System.IO.StreamWriter -ArgumentList $OutputFileName,$false
# Write overview information
$Sw.WriteLine('{0} Time zones on this system' -f $TimeZones.Count)

# Process each timezone on the system
# Write details to the streamwriter
foreach ($TimeZone in $TimeZones) {
 $HasDST        = $TimeZone.SupportsDaylightSavingTime
 $OffsetFromUtc = $TimeZone.BaseUtcOffset
 $Sw.WriteLine("ID: {0}" -f $TimeZone.Id)
 $Sw.WriteLine("   Display Name:  {0}" -f $TimeZone.DisplayName)
 $Sw.WriteLine("   Standard Name: {0}" -f $TimeZone.StandardName)
 $Sw.Write("   Daylight Name: {0}" -f $TimeZone.DaylightName)
 $Sw.Write( $(If ($HasDST) {"  ***Has: "} Else {"  ***Does Not Have: "}))
 $Sw.WriteLine("Daylight Saving Time***")
 $OffsetString = "{0} hours, {1} minutes" -f $OffsetFromUtc.Hours, $OffsetFromUtc.Minutes
 $Sw.WriteLine("   Offset from UTC: {0}"  -f $offsetString)
 $AdjustRules = $timeZone.GetAdjustmentRules()
 $Sw.WriteLine("   Number of adjustment rules: {0}" -f $adjustRules.Count)
 If ($AdjustRules.Count -gt 0)
 {
    $Sw.WriteLine("   Adjustment Rules:")
    foreach ($Rule in $AdjustRules)
    {
       $TransTimeStart = $Rule.DaylightTransitionStart
       $TransTimeEnd   = $Rule.DaylightTransitionEnd
       $Sw.WriteLine(("     From   {0} to {1}" -f $Rule.DateStart, $Rule.DateEnd))
       $Sw.WriteLine(("       Delta: {0}" -f $Rule.DaylightDelta))
       if (-Not  $TransTimeStart.IsFixedDateRule)
       {
          $Sw.WriteLine(("       Begins at {0:t} on {1} of week {2} of {3}" -f $TransTimeStart.TimeOfDay, 
                                                                             $TransTimeStart.DayOfWeek,                                                                                 
                                                                             $TransTimeStart.Week, 
                                                                             $DateFormats.MonthNames[$TransTimeStart.Month - 1]))
          $Sw.WriteLine(("       Ends at {0:t} on {1} of week {2} of {3}" -f $TransTimeEnd.TimeOfDay,
                                                                             $TransTimeEnd.DayOfWeek, 
                                                                             $TransTimeEnd.Week,
                                                                             $DateFormats.MonthNames[[int] $TransTimeEnd.Month - 1]))
       }
     else
       {
         $Sw.WriteLine(("       Begins at {0:t} on {1} {2}" -f $TransTimeStart.TimeOfDay, 
                                                             $TransTimeStart.Day, 
                                                             $DateFormats.MonthNames[$transTimeStart.Month - 1]))
         $Sw.WriteLine(("       Ends at {0:t} on {1} {2}"   -f $TransTimeEnd.TimeOfDay, 
                                                             $TransTimeEnd.Day, 
                                                             $DateFormats.MonthNames[$transTimeEnd.Month - 1]))        
       }
    } # End of processing each adjustment rule
 } # End of checking adjustment rules
} # End of processing Time Zones

# Close stream writer then display output in notepad
$Sw.Close() 

#  Output of 1st three time zones:
#  135 Time zones on this system
#  ID: Dateline Standard Time
#     Display Name:  (UTC-12:00) International Date Line West
#     Standard Name: Dateline Standard Time
#     Daylight Name: Dateline Summer Time  ***Does Not Have: Daylight Saving Time***
#     Offset from UTC: -12 hours, 0 minutes
#     Number of adjustment rules: 0
#  ID: UTC-11
#     Display Name:  (UTC-11:00) Co-ordinated Universal Time-11
#     Standard Name: UTC-11
#     Daylight Name: UTC-11  ***Does Not Have: Daylight Saving Time***
#     Offset from UTC: -11 hours, 0 minutes
#     Number of adjustment rules: 0
#  ID: Aleutian Standard Time
#     Display Name:  (UTC-10:00) Aleutian Islands
#     Standard Name: Aleutian Standard Time
#     Daylight Name: Aleutian Summer Time  ***Has: Daylight Saving Time***
#     Offset from UTC: -10 hours, 0 minutes
#     Number of adjustment rules: 2
#     Adjustment Rules:
#       From   01/01/0001 00:00:00 to 31/12/2006 00:00:00
#         Delta: 01:00:00
#         Begins at 02:00 on Sunday of week 1 of April
#         Ends at 02:00 on Sunday of week 5 of October
#       From   01/01/2007 00:00:00 to 31/12/9999 00:00:00
#         Delta: 01:00:00
#         Begins at 02:00 on Sunday of week 2 of March
#         Ends at 02:00 on Sunday of week 1 of November

Комментарии

Метод GetSystemTimeZones извлекает все доступные сведения о часовом поясе из подразделов раздела HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones реестра в системах Windows и из библиотеки ICU в Linux и macOS. Если не удается успешно получить и проанализировать значения для определенных строковых свойств отдельных TimeZoneInfo объектов, этот метод устанавливает для него значение пустой строки ("").

Важно!

Метод GetSystemTimeZones возвращает коллекцию объектов только для часовых поясов TimeZoneInfo , определенных в реестре Windows или библиотеке ICU. Он не включает часовые пояса, созданные с помощью перегрузок CreateCustomTimeZone метода . Они доступны только через ссылку на объект, возвращенную методом создания часового пояса.

Коллекция, возвращаемая этим методом, сортируется по смещению в формате UTC, а для часовых поясов с таким же смещением в формате UTC — по отображаемой имени с использованием текущего языка и региональных параметров. Сведения о отображаемом имени см. в разделе DisplayName.

Объект ReadOnlyCollection<T> , возвращаемый этим методом, поддерживает IEnumerable<T> интерфейс , что означает, что его можно выполнить итерации с помощью инструкций foreach (в C#) или For Each…Next (в Visual Basic). Каждая итерация цикла предоставляет следующий TimeZoneInfo объект в коллекции.

Коллекция TimeZoneInfo объектов представляет часовые пояса, определенные на локальном компьютере; она не обязательно предоставляет полную информацию для всех часовых поясов за все периоды времени. Если приложению требуются часовые пояса, которые не найдены на локальном компьютере, можно создать настраиваемые часовые пояса с помощью перегрузок CreateCustomTimeZone метода . Дополнительные сведения см. в разделах Практическое руководство. Создание часовых поясов без правил корректировки и Практическое руководство. Создание часовых поясов с помощью правил корректировки.

Вы также можете определить, определен ли отдельный часовой пояс на локальном компьютере, вызвав FindSystemTimeZoneById метод и указав идентификатор часового пояса, который требуется извлечь в качестве параметра.

Применяется к

GetSystemTimeZones(Boolean)

Исходный код:
TimeZoneInfo.cs
Исходный код:
TimeZoneInfo.cs

Возвращает объект , ReadOnlyCollection<T> содержащий все допустимые часовые пояса с локального компьютера. Этот метод не вызывает исключение TimeZoneNotFoundException или InvalidTimeZoneException.

public:
 static System::Collections::ObjectModel::ReadOnlyCollection<TimeZoneInfo ^> ^ GetSystemTimeZones(bool skipSorting);
public static System.Collections.ObjectModel.ReadOnlyCollection<TimeZoneInfo> GetSystemTimeZones (bool skipSorting);
static member GetSystemTimeZones : bool -> System.Collections.ObjectModel.ReadOnlyCollection<TimeZoneInfo>
Public Shared Function GetSystemTimeZones (skipSorting As Boolean) As ReadOnlyCollection(Of TimeZoneInfo)

Параметры

skipSorting
Boolean

Если trueзадано значение , возвращаемая коллекция не обязательно будет отсортирована.

Возвращаемое значение

Комментарии

Задав для параметра skipSorting значение true, метод попытается избежать сортировки возвращаемой коллекции. Этот вариант может быть полезен, если вызывающей объекту не требуется отсортированный список и направлен на повышение производительности.

Применяется к