14

我知道我们可以改变当前线程的当前文化。而且我知道我们无法从中获取TimeZoneInfo信息,CurrentCulture 因为一种文化可能有许多时区 ,例如美国

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

如果我们能做出这样的事情,那就太好了:

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

1 回答 1

10

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

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

例如,假设您正在寻找其他时区的当前时间。您可能正在寻找执行此操作的能力:

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

但是,您应该在适当的情况下简单地从 UTC 转换:

var now = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
                       DateTime.UtcNow, "some other timezone id");
于 2013-03-28T14:22:11.330 回答