【问题标题】:How to correctly find TimeZoneInfo for America/Los_Angeles using C# [duplicate]如何使用 C# 正确查找 America/Los_Angeles 的 TimeZoneInfo [重复]
【发布时间】:2021-02-21 21:34:44
【问题描述】:

我正在尝试使用 C# 获取 TimeZoneInfo。

我尝试使用TimeZoneInfo.FindSystemTimeZoneById("America/Los_Angeles");,但失败并出现以下错误

System.TimeZoneNotFoundException: '时区 ID 在本地计算机上找不到“America/Los_Angeles”。'

如何使用 C# 正确查找 America/Los_Angeles 的 TimeZoneInfo?

【问题讨论】:

标签: c# datetime timezone


【解决方案1】:

我建议使用TimeZoneConverter 包来获取时区信息。

PM> Install-Package TimeZoneConverter

然后您可以使用以下任何方式获取 TimeZoneInfo

TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo("Pacific Standard");
TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo("America/Los_Angeles");

【讨论】:

    【解决方案2】:

    TimeZoneInfo.FindSystemTimeZoneById 接受在 Windows 注册表中找到的ID(具体来说,HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zone),因此它必须是存在于机器上的一个。洛杉矶位于“太平洋标准时间”区域。

    因此,要计算当前洛杉矶时间,您需要先获取“太平洋标准时间”区域的TimeZoneInfo,然后才能获取当前UTC时间和AddTimeZoneInfo' sBaseUtcOffset给它计算洛杉矶的时间。

    TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
    DateTime laTime = DateTime.UtcNow.Add(timeZoneInfo.BaseUtcOffset); 
    

    【讨论】:

    • 我使用的 CMS 将时区 ID 返回为 America/Los_Angeles 而不是 Pacific Standard Time。我希望能够使用 CMS 提供的 id 并获取 TimeZoneInfo。有没有办法将America/Los_Angeles 转换为Pacific Standard Time
    • @Jay 如果您想使用 TimeZoneInfo 方法,您可以在项目中维护某种代码结构,将 CMS 值转换为您必须使用的 ID。您不能简单地使用 CMS 值,否则您将抛出 TimeZoneNotFoundException(除非 CMS 值恰好对应于注册表中的 ID)。除非您只使用少数几个时区,否则维护这样的东西可能会很麻烦。
    猜你喜欢
    • 2019-09-01
    • 2014-06-08
    • 2019-03-07
    • 2020-03-24
    • 2020-09-28
    • 1970-01-01
    • 2012-04-22
    • 2021-02-04
    • 2017-05-27
    相关资源
    最近更新 更多