关于c ++:Windows程序如何暂时改变其时区?

How can a Windows program temporarily change its time zone?

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

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

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

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


使用Isolation / Mocking框架 - 我目前唯一知道的是Isolator ++目前处于测试阶段,我相信你可以通过向Typemock的优秀人员索取一个来获得副本。


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


查看_putenv_s和_tzset。理论上,您应该能够使用_putenv_s为进程设置TZ环境变量,然后使用_tzset将进程的实际本地时区设置为TZ环境变量的设置。

我知道这可以在Linux上使用putenv和tzset,并且从_putenv_s和_tzset的文档中可以看出,你应该能够在Windows上对它们做同样的事情。我还没有尝试过。


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

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

当然,您需要自己进行数学运算才能找到UTC与"新"时区之间的秒数。


为GetTimeZoneInformation安装一个钩子,它用你自己的首选项覆盖系统数据。


我有完全相同的要求:

- >某些进程必须停留在UTC,其他进程必须停留在与Windows系统时区不同的某个时区

经过数月(中断)研究后,我得出的结论是,在Windows上只能设置"UTC"或"当前"系统时区。所以只能做以下事情:

1
2
     - set TZ="UTC"
     - unset TZ


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


你见过SetTimeZoneInformation Win32 API函数吗?