如何在 dot net core 中获取另一个时区的本地时间

Jen*_*nsB 4 c# timezone datetimeoffset .net-core

我正在解决一个问题,我需要获取另一个时区的当前日期和时间。我不知道我的代码将在哪个时区运行,并且它需要在 Windows 和 Linux 机器上运行。

我还没有找到任何方法可以做到这一点。有任何想法吗?

(PS:我特别需要找到瑞典的时间,包括代码可能运行的任意时区的夏令时)。

Mat*_*int 7

瑞典的 IANA 时区 ID 为"Europe/Stockholm"(用于 Linux、OSX 和其他非 Windows 平台)。瑞典的 Windows 时区 ID 是"W. Europe Standard Time"

因此,您可以执行以下操作:

// Determine the time zone ID for Sweden
string timeZoneId = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
    ? "W. Europe Standard Time"
    : "Europe/Stockholm";

// Get a TimeZoneInfo object for that time zone
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);

// Convert the current UTC time to the time in Sweden
DateTimeOffset currentTimeInSweden = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, tzi);
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以使用我的TimeZoneConverter库来简化此过程,该库允许您在任何平台上使用任一 id。

TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo("Europe/Stockholm");
DateTimeOffset currentTimeInSweden = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, tzi);
Run Code Online (Sandbox Code Playgroud)

如果在 .NET 6 或更高版本上运行,并且启用了ICU 全球化支持,则不再需要使用我的库。如果需要,.NET 将自动从一种格式转换为另一种格式。所以你可以这样做:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Europe/Stockholm");
DateTimeOffset currentTimeInSweden = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, tzi);
Run Code Online (Sandbox Code Playgroud)

另请注意,代码运行的时区不相关,也不应该相关。瑞典的夏令时规则是唯一相关的,而不是代码可能运行所在时区的规则。

最后,请注意,如果您希望获得有效的结果,则必须正确设置计算机的时钟。请始终使用 NTP 或操作系统的“自动设置日期和时间”功能将计算机时钟与 Internet 同步。