如何以 TZ 格式检索系统时区 .net c#

问题描述 投票:0回答:3

我正在尝试弄清楚如何在 Windows 上以 (TZ) 格式检索当前系统时区,即。 America/New_York,我需要将其提供给该应用程序与之通信的 API。

我目前正在使用

TimeZone.CurrentTimeZone

这给了我这个输出

GMT Standard Time

我希望得到的是类似的东西

Europe/London

我是否遗漏了一些简单的东西,或者这不可用,这是否意味着我需要自己进行转换?

c# .net timezone
3个回答
11
投票

我建议使用NodaTime

您可以这样获取系统的时区:

DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();

如果您使用

tz.ToString()

,它将根据您的需要获取 IANA 时区

(除此之外,它是一个非常好的开源库,以恕我直言,比内置的 .NET DateTime 类更加结构化和可靠的方式处理时区、日期时间、瞬间和日历)。

NodaTime 得到了 SO 中一些高代表用户的维护和良好支持;) .


仅供参考,您获得但不想要的输出(.NET 使用的输出)称为 BCL 时区,但您需要 IANA 时区(或 TZDB)(更准确)


8
投票

野田时间是一个很好的选择。 与 .NET 内置的 API 相比,它是一个更好、更全面的 API,用于处理日期、时间和时区。

但是,如果以 IANA TZDB 格式获取系统时区是您在此领域所做的唯一事情,您可能会发现使用我的 TimeZoneConverter 库会更简单。

string tz = TZConvert.WindowsToIana(TimeZoneInfo.Local.Id);

3
投票

从 .NET6 开始,TimeZoneInfo 已得到增强,可以处理 IANA tz 字符串和 Windows 时区之间的差异。

// Conversion from IANA to Windows
string ianaId1 = "America/Los_Angeles";
if (!TimeZoneInfo.TryConvertIanaIdToWindowsId(ianaId1, out string winId1))
    throw new TimeZoneNotFoundException($"No Windows time zone found for \"{ ianaId1 }\".");
Console.WriteLine($"{ianaId1} => {winId1}");  // "America/Los_Angeles => Pacific Standard Time"

// Conversion from Windows to IANA when a region is unknown
string winId2 = "Eastern Standard Time";
if (!TimeZoneInfo.TryConvertWindowsIdToIanaId(winId2, out string ianaId2))
    throw new TimeZoneNotFoundException($"No IANA time zone found for \"{ winId2 }\".");
Console.WriteLine($"{winId2} => {ianaId2}");  // "Eastern Standard Time => America/New_York"

// Conversion from Windows to IANA when a region is known
string winId3 = "Eastern Standard Time";
string region = "CA"; // Canada
if (!TimeZoneInfo.TryConvertWindowsIdToIanaId(winId3, region, out string ianaId3))
    throw new TimeZoneNotFoundException($"No IANA time zone found for \"{ winId3 }\" in \"{ region }\".");
Console.WriteLine($"{winId3} + {region} => {ianaId3}");  // "Eastern Standard Time + CA => America/Toronto"

请注意,此代码来自有关 .NET6 时间、日期和时区更改的 Microsoft 博客文章。

© www.soinside.com 2019 - 2024. All rights reserved.