如何设置每个线程的时区

本文关键字:线程 时区 何设置 设置 | 更新日期: 2023-09-27 18:06:12

我知道我们可以更改当前线程的当前文化。我知道我们不能从CurrentCulture 得到TimeZoneInfo因为一个文化可能有许多时区像美国

但是要使用相同的技术来处理当前线程的TimeZone。

如果我们可以这样写就好了:

TimeZone.CurrentTimeZone = TimeZoneInfo.FindSystemTimeZoneById("timezone id");

如何设置每个线程的时区

不幸的是,任何"当前"时区的概念都与运行代码的机器的操作系统设置相关联。有一些用于更改时区的Win32 api,但我不建议使用它们。它们不仅不是"线程安全的",而且也不是"进程安全的"。时区设置会影响机器上运行的所有内容。

也就是说,我很好奇你的用例到底是什么。如果您可以为每个线程设置时区,那么您可能完全不依赖于本地设置。您可以使用TimeZoneInfo上的转换方法。

例如,假设您正在查找其他时区的当前时间。您可能正在寻找这样做的能力:

using (TimeZone.CurrentTimeZone = ...  )
{
    var now = DateTime.Now;
}

但是你应该在适当的地方直接从UTC转换:

var now = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
                       DateTime.UtcNow, "some other timezone id");