如何为每个线程设置时区? [关闭]

Posted

技术标签:

【中文标题】如何为每个线程设置时区? [关闭]【英文标题】:How to set Timezone per thread? [closed] 【发布时间】:2013-03-18 22:14:02 【问题描述】:

我知道我们可以更改当前线程的当前文化。 而且我知道我们无法从CurrentCulture 得到TimeZoneInfo 因为一种文化可能有很多时区 比如美国

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

如果我们能做出这样的东西那就太好了:

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

【问题讨论】:

我们不是 .NET 网站所需的功能,我们是可靠问题网站的可靠答案。时区处理在最好的情况下并非易事,增加每个线程时区的复杂性层只是自找麻烦 @Petesh 我并不是要问为什么。我想知道这是否可能以某种方式。 没有什么能阻止你为时区创建线程本地对象,只是除了你的代码之外没有任何东西会使用它。您应该查看 .NET 中的 ThreadLocal<T> Class 以了解实现它的简单方法。 我正在为一些我不控制对 DateTime.Now 的调用的代码编写单元测试,因此我想这样做。正如提问者所提到的,在运行测试的当前线程上切换文化是一种非常常见的技术,为什么你不能对时区信息做同样的事情呢? (我希望你能做到。) 【参考方案1】:

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

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

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

using (TimeZone.CurrentTimeZone = ...  )

    var now = DateTime.Now;

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

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

【讨论】:

时区隐含在许多不同的函数中(例如使用AdjustToUniversal从字符串转换为日期时间)。当然可以手动更改它们以使用明确的时区,但在大型代码库中并不容易。以同样的方式,您可以明确指定要在 string.Format() 等函数中使用的文化 - 但是您可以选择为线程设置文化并一次性“修复它们”。 是的,它被许多函数在内部使用,但是不——你不能改变它。没有钩子,一切都是密封的。人们会认为它的行为类似于cultureinfo,但事实并非如此。这是完全不同的。只有一个系统范围的时区设置。 是的,我知道 - 我之前的评论是试图回答你的问题'这样的事情的用例是什么 - 如果它存在的话。 使用DateTimeOffset,而不是日期时间,如果使用计算机范围操作系统时区设置以外的任何时区中的数据。 不要使用时区。严重地。这个问题以及更多问题都会消失。

以上是关于如何为每个线程设置时区? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何为网站设置负载/压力测试? [关闭]

如何为大型历史数据构建mysql表? [关闭]

如何为 Flutter 应用程序开发设置 Android Studio? [关闭]

如何为加载已关闭的外部 javascript 文件设置超时

如何为php Web应用程序开发设置环境[关闭]

如何为我的应用正确设置最低 iOS 版本? [关闭]