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 方法检索东京标准时区。 然后,此 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 不区分大小写。 如果要基于部分匹配项检索时区对象,可以编写自定义过程,以处理 方法返回GetSystemTimeZones的对象TimeZoneInfo只读集合。

在 Windows 系统上, FindSystemTimeZoneById 尝试匹配 id 注册表 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones 分支的子项名称。 在 Linux 和 macOS 上,它使用 ICU 库中提供的时区信息。 如果注册表或库没有所需时区的信息,可以通过调用 方法的重载 CreateCustomTimeZone 之一或调用 FromSerializedString 反序列化 TimeZoneInfo 表示所需时区的对象来创建特定的时区。 但是,这些方法调用创建的时区不是系统定义的时间,不能使用 FindSystemTimeZoneById 方法检索。 只能通过 或 FromSerializedString 方法调用返回CreateCustomTimeZone的对象引用来访问这些自定义时区。

在 .NET 7 及更早版本中,此方法为每个方法调用返回一个新 TimeZoneInfo 实例。 这可能会影响使用相同标识符重复调用 FindSystemTimeZoneById 方法的应用程序的性能。 (在 .NET 8 及更高版本中,此方法始终返回缓存 TimeZoneInfo 实例。)

适用于

另请参阅