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

时间:2013-03-28 12:57:54

标签: c# .net multithreading datetime timezone

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

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

如果我们能做出类似这样的事情会非常好:

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

1 个答案:

答案 0 :(得分:7)

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

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

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

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

但你应该在适当的时候从UTC转换:

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