如何设置每个线程的时区?

Wah*_*tar 6 .net c# timezone datetime multithreading

我知道我们可以改变当前线程的当前文化.我知道,我们不能让TimeZoneInfoCurrentCulture 因为一个文化可能有很多的时区 如美国

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

如果我们能做出这样的事情,那将是非常好的:

TimeZone.CurrentTimeZone = TimeZoneInfo.FindSystemTimeZoneById("timezone id");
Run Code Online (Sandbox Code Playgroud)

Mat*_*int 7

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

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

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

using (TimeZone.CurrentTimeZone = ...  )
{
    var now = DateTime.Now;
}
Run Code Online (Sandbox Code Playgroud)

但相反,您应该在适当的时候从UTC转换:

var now = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
                       DateTime.UtcNow, "some other timezone id");
Run Code Online (Sandbox Code Playgroud)

  • 是的,它在很多功能内部使用,但没有 - 你无法改变它.没有挂钩,一切都是密封的.人们会认为它会像cultureinfo一样,但事实并非如此.这完全不同.系统范围内只有一个时区设置. (2认同)