How can a Windows program temporarily change its time zone?
我写了一个函数来返回对应于给定日午夜的
现在我正在为这个函数编写单元测试,其中一个测试应该复制埃及场景。 在Unix中,我可以像这样完成它:
1 2 | putenv("TZ","Egypt", true); tzset(); |
在这样做之后,对
使用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),我能够通过更改
我同意,这不是一个干净的方法,但至少这可能是一种解决方法。
当然,您需要自己进行数学运算才能找到UTC与"新"时区之间的秒数。
为GetTimeZoneInformation安装一个钩子,它用你自己的首选项覆盖系统数据。
我有完全相同的要求:
- >某些进程必须停留在UTC,其他进程必须停留在与Windows系统时区不同的某个时区
经过数月(中断)研究后,我得出的结论是,在Windows上只能设置"UTC"或"当前"系统时区。所以只能做以下事情:
1 2 | - set TZ="UTC" - unset TZ |
我使用
你见过SetTimeZoneInformation Win32 API函数吗?