我正在尝试弄清楚如何在 Windows 上以 (TZ) 格式检索当前系统时区,即。 America/New_York,我需要将其提供给该应用程序与之通信的 API。
我目前正在使用
TimeZone.CurrentTimeZone
这给了我这个输出
GMT Standard Time
我希望得到的是类似的东西
Europe/London
我是否遗漏了一些简单的东西,或者这不可用,这是否意味着我需要自己进行转换?
我建议使用NodaTime。
您可以这样获取系统的时区:
DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();
如果您使用
tz.ToString()
,它将根据您的需要获取 IANA 时区
(除此之外,它是一个非常好的开源库,以恕我直言,比内置的 .NET DateTime 类更加结构化和可靠的方式处理时区、日期时间、瞬间和日历)。
NodaTime 得到了 SO 中一些高代表用户的维护和良好支持;) .
仅供参考,您获得但不想要的输出(.NET 使用的输出)称为 BCL 时区,但您需要 IANA 时区(或 TZDB)(更准确)
野田时间是一个很好的选择。 与 .NET 内置的 API 相比,它是一个更好、更全面的 API,用于处理日期、时间和时区。
但是,如果以 IANA TZDB 格式获取系统时区是您在此领域所做的唯一事情,您可能会发现使用我的 TimeZoneConverter 库会更简单。
string tz = TZConvert.WindowsToIana(TimeZoneInfo.Local.Id);
从 .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 博客文章。