Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows程序如何临时更改其时区?_C++_Windows_Unit Testing_Timezone - Fatal编程技术网

C++ Windows程序如何临时更改其时区?

C++ Windows程序如何临时更改其时区?,c++,windows,unit-testing,timezone,C++,Windows,Unit Testing,Timezone,我编写了一个函数来返回给定日期午夜对应的time\t值。当给定的一天没有午夜时,它返回可用的最早时间;例如,当埃及进入夏时制时,这种情况就会发生。今年,时间变更在4月29日午夜生效,因此时钟直接从23:59转到01:00 现在我正在为这个函数编写单元测试,其中一个测试应该复制埃及场景。在Unix中,我可以这样完成: putenv("TZ", "Egypt", true); tzset(); 这样做之后,对localtime的进一步调用就好像在埃及而不是明尼苏达州一样,我的测试通过了。不过,仅仅

我编写了一个函数来返回给定日期午夜对应的
time\t
值。当给定的一天没有午夜时,它返回可用的最早时间;例如,当埃及进入夏时制时,这种情况就会发生。今年,时间变更在4月29日午夜生效,因此时钟直接从23:59转到01:00

现在我正在为这个函数编写单元测试,其中一个测试应该复制埃及场景。在Unix中,我可以这样完成:

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

这样做之后,对
localtime
的进一步调用就好像在埃及而不是明尼苏达州一样,我的测试通过了。不过,仅仅设置环境变量对Windows没有任何影响。我该怎么做才能使单元测试认为它在其他地方,而不影响系统上运行的其他程序?

您看到Win32 API函数了吗

我使用
setlocale(LC_ALL,“deu_aut”)
将语言/国家设置切换到奥地利-在
locale.h
中声明。遗憾的是,我没有找到埃及的语言/国家字符串,但这可能给了您一个提示。

我有完全相同的要求:

->某些进程必须固定在UTC,而其他进程必须固定在与Windows系统时区不同的时区

经过数月(中断)的研究,我得出结论,在Windows上,只能设置“UTC”或“当前”系统时区。因此,只能执行以下操作:

- set TZ="UTC" - unset TZ -set TZ=“UTC” -未完成
使用隔离/模拟框架-目前我所知道的唯一一个框架是目前处于测试阶段的框架,我相信您可以通过向Typemock的优秀人员索要一个框架来获得副本。

请查看。理论上,您应该能够使用\u putenv\u s为流程设置TZ环境变量,然后使用\u tzset将流程的实际本地时区设置为TZ环境变量设置的时区


我知道这可以在Linux上使用putenvtzset,从\u putenv\u s\u tzset的文档中可以看出,您应该可以在Windows上使用它们。不过我还没有真正尝试过。

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

安装一个钩子来获取TimeZoneInformation,它会用您自己的首选项覆盖系统数据。

使用VS 2008(C++本机),我可以通过更改
\u timezone
变量来修改
localtime()
的行为

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


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

whoosh。。也许可以制作一个钩子来更改测试的本地时间行为?这不会改变整个操作系统的时区吗?我想要一些仅限于当前进程(或线程)的、适合在单元测试中使用的东西。@Rob:是的,它会影响整个机器。据我所知,没有线程本地版本。然而,如果只是为了单元测试的目的,那么如果你在测试拆卸方法中恢复原来的时区,那可能还是可以的。也许我的雇主对单元测试的理念与你不同。如果某个内容更改了系统范围的设置,它将不再被归类为单元测试,并且不会作为构建过程的一部分运行。许多人可能使用相同的构建服务器,他们的测试不应该相互干扰。埃及的语言和国家是阿拉伯语。但这些设置不会影响时区。它们可能会影响用于显示当前时间的格式,但事实并非如此。