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


TimeZoneInfo.FindSystemTimeZoneById(String) Метод

Определение

TimeZoneInfo Возвращает объект на основе его идентификатора.

public:
 static TimeZoneInfo ^ FindSystemTimeZoneById(System::String ^ id);
public static TimeZoneInfo FindSystemTimeZoneById(string id);
static member FindSystemTimeZoneById : string -> TimeZoneInfo
Public Shared Function FindSystemTimeZoneById (id As String) As TimeZoneInfo

Параметры

id
String

Идентификатор часового пояса, соответствующий свойству Id .

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

Объект, идентификатор которого является значением id параметра.

Исключения

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

Параметр id имеет значение null.

Идентификатор часового пояса, указанный id не найден. Это означает, что идентификатор часового пояса, имя id которого не существует, или что идентификатор существует, но не содержит данных часового пояса.

Процесс не имеет разрешений, необходимых для чтения из раздела реестра, содержащего сведения о часовом поясе.

Идентификатор часового пояса найден, но данные реестра повреждены.

Примеры

В следующем примере используется FindSystemTimeZoneById метод для получения часового пояса Токио Standard. Затем этот TimeZoneInfo объект используется для преобразования локального времени в время в Токио и определения того, является ли это Токио стандартным временем или Токио дневного времени.

using System;

public class Example
{
   public static void Main()
   {
      // Get time in local time zone 
      DateTime thisTime = DateTime.Now;
      Console.WriteLine("Time in {0} zone: {1}", TimeZoneInfo.Local.IsDaylightSavingTime(thisTime) ?
                        TimeZoneInfo.Local.DaylightName : TimeZoneInfo.Local.StandardName, thisTime);
      Console.WriteLine("   UTC Time: {0}", TimeZoneInfo.ConvertTimeToUtc(thisTime, TimeZoneInfo.Local));
      // Get Tokyo Standard Time zone
      TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
      DateTime tstTime = TimeZoneInfo.ConvertTime(thisTime, TimeZoneInfo.Local, tst);      
      Console.WriteLine("Time in {0} zone: {1}", tst.IsDaylightSavingTime(tstTime) ?
                        tst.DaylightName : tst.StandardName, tstTime);
      Console.WriteLine("   UTC Time: {0}", TimeZoneInfo.ConvertTimeToUtc(tstTime, tst));
   }
}
// The example displays output like the following when run on a system in the
// U.S. Pacific Standard Time zone:
//       Time in Pacific Standard Time zone: 12/6/2013 10:57:51 AM
//          UTC Time: 12/6/2013 6:57:51 PM
//       Time in Tokyo Standard Time zone: 12/7/2013 3:57:51 AM
//          UTC Time: 12/6/2013 6:57:51 PM
open System

// Get time in local time zone 
let thisTime = DateTime.Now
printfn $"Time in {if TimeZoneInfo.Local.IsDaylightSavingTime thisTime then TimeZoneInfo.Local.DaylightName else TimeZoneInfo.Local.StandardName} zone: {thisTime}"
printfn $"   UTC Time: {TimeZoneInfo.ConvertTimeToUtc(thisTime, TimeZoneInfo.Local)}"
// Get Tokyo Standard Time zone
let tst = TimeZoneInfo.FindSystemTimeZoneById "Tokyo Standard Time"
let tstTime = TimeZoneInfo.ConvertTime(thisTime, TimeZoneInfo.Local, tst)      
printfn $"Time in {if tst.IsDaylightSavingTime tstTime then tst.DaylightName else tst.StandardName} zone: {tstTime}"
printfn $"   UTC Time: {TimeZoneInfo.ConvertTimeToUtc(tstTime, tst)}"
// The example displays output like the following when run on a system in the
// U.S. Pacific Standard Time zone:
//       Time in Pacific Standard Time zone: 12/6/2013 10:57:51 AM
//          UTC Time: 12/6/2013 6:57:51 PM
//       Time in Tokyo Standard Time zone: 12/7/2013 3:57:51 AM
//          UTC Time: 12/6/2013 6:57:51 PM
Module Example
   Public Sub Main()
      ' Get time in local time zone 
      Dim thisTime As Date = Date.Now
      Console.WriteLine("Time in {0} zone: {1}", IIf(TimeZoneInfo.Local.IsDaylightSavingTime(thisTime), 
                        TimeZoneInfo.Local.DaylightName, TimeZoneInfo.Local.StandardName), thisTime)
      Console.WriteLine("   UTC Time: {0}", TimeZoneInfo.ConvertTimeToUtc(thisTime, TimeZoneInfo.Local))
      ' Get Tokyo Standard Time zone
      Dim tst As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time")
      Dim tstTime As Date = TimeZoneInfo.ConvertTime(thisTime, TimeZoneInfo.Local, tst)      
      Console.WriteLine("Time in {0} zone: {1}", IIf(tst.IsDaylightSavingTime(tstTime), 
                        tst.DaylightName, tst.StandardName), tstTime)
      Console.WriteLine("   UTC Time: {0}", TimeZoneInfo.ConvertTimeToUtc(tstTime, tst))
   End Sub
End Module
' The example displays output like the following when run on a system in the U.S.
' Pacific Standard Time zone:
'    Time in Pacific Standard Time zone: 12/6/2013 10:57:51 AM
'       UTC Time: 12/6/2013 6:57:51 PM
'    Time in Tokyo Standard Time zone: 12/7/2013 3:57:51 AM
'       UTC Time: 12/6/2013 6:57:51 PM

Комментарии

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

В системах FindSystemTimeZoneById Windows пытается сопоставить id имена подразделов HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones ветви реестра. Начиная с .NET 6, системы Windows также поддерживают идентификаторы часового пояса IANA (например, "Америка/Los_Angeles" или "Pacific/Auckland"), предоставляя кроссплатформенное разрешение часовых поясов. Идентификаторы IANA поддерживаются в Windows только в том случае, если NLS не включен и не включен режим авариантной глобализации. В Linux и macOS используется информация о часовом поясе, доступная в библиотеке ICU. Если в реестре или библиотеке нет сведений о нужном часовом поясе, можно создать определенный часовой пояс, вызвав одну из перегрузок CreateCustomTimeZone метода или вызвав FromSerializedString десериализацию TimeZoneInfo объекта, представляющего необходимый часовой пояс. Однако часовые пояса, созданные этими вызовами метода, не определяются системой и не могут быть получены с помощью FindSystemTimeZoneById метода. Доступ к этим пользовательским часовых поясам можно получить только через ссылку на объект, возвращаемую CreateCustomTimeZone вызовом метода или FromSerializedString метода.

В .NET 7 и более ранних версиях этот метод возвращает новый TimeZoneInfo экземпляр для каждого вызова метода. Это может повлиять на производительность в приложениях, которые многократно вызывают FindSystemTimeZoneById метод с одинаковым идентификатором. (В .NET 8 и более поздних версиях этот метод всегда возвращает кэшированный TimeZoneInfo экземпляр.)

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

См. также раздел