Windows程序如何暂时更改其时区?

我已经写了一个函数来返回在给定的一天中对应于午夜的time_t值。 当某一天没有午夜时,它会返回最早的可用时间; 例如,当埃及进入夏时制时,就会出现这种情况。 今年四月二十九日深夜,时间变更生效,所以钟表从23点59分直到01点。

现在我正在为这个函数编写unit testing,其中一个testing应该复制埃及的情况。 在Unix中,我可以像这样完成它:

 putenv("TZ", "Egypt", true); tzset(); 

在这之后,进一步打电话给localtime ,就好像他们在埃及而不是明尼苏达州,我的testing通过。 但是,仅仅设置环境variables对Windows没有任何影响。 我能做些什么来使unit testing认为它在别的地方,而不影响系统上运行的程序的其余部分?

Solutions Collecting From Web of "Windows程序如何暂时更改其时区?"

使用隔离/模拟框架 – 目前我所知道的唯一一个是目前处于测试阶段的隔离器++ ,我相信你可以从Typemock的好人那里获得一个副本。

_putenv_s_tzset 。 理论上,你应该可以用_putenv_s来为你的进程设置TZ环境变量,然后使用_tzset来设置你的进程的实际本地时区为TZ环境变量的设置。

我知道这在putenvtzset的 Linux上运行,从_putenv_s_tzset的文档看来,你应该可以在Windows上对它们进行相同的操作。 我还没有尝试过。

请不要调用SetTimeZoneInformation – Windows中没有线程或进程特定的时区概念。 正如其他人所说,最简单的方法是模拟时区代码 – 使用Pex / Mocks,您甚至可以模拟出静态方法,这意味着您可以挂接标准的.NET时区代码来替换它自己的。 如果你使用的是C / C ++,你只需要连接代码来让TZ信息可以被嘲弄。

使用VS 2008(C ++ native),我可以通过改变_timezone变量来修改localtime()的行为。

我同意,这不是一个干净的方法,但至少这可能是一个解决方法。

当然,你需要自己去计算UTC和你的“新”时区之间的秒数。

我使用setlocale(LC_ALL, "deu_aut")将语言/国家设置切换到奥地利 – 在locale.h声明。 可悲的是,我还没有找到埃及的语言/国家字符串,但也许这给你一个提示。

我有完全一样的要求:

– >一些进程必须坚持U​​TC和其他一些不同于Windows系统时区的时区

经过数月的( 中断 )研究,我得出结论:在Windows上只能设置“UTC”或“当前”系统时区。 所以只有以下几点可以完成:

      - 设定TZ =“UTC” 
      - 取消TZ

安装一个钩子GetTimeZoneInformation,它会覆盖您自己的喜好的系统数据。

你见过SetTimeZoneInformation Win32 API函数吗?