我已经写了一个函数来返回在给定的一天中对应于午夜的time_t
值。 当某一天没有午夜时,它会返回最早的可用时间; 例如,当埃及进入夏时制时,就会出现这种情况。 今年四月二十九日深夜,时间变更生效,所以钟表从23点59分直到01点。
现在我正在为这个函数编写unit testing,其中一个testing应该复制埃及的情况。 在Unix中,我可以像这样完成它:
putenv("TZ", "Egypt", true); tzset();
在这之后,进一步打电话给localtime
,就好像他们在埃及而不是明尼苏达州,我的testing通过。 但是,仅仅设置环境variables对Windows没有任何影响。 我能做些什么来使unit testing认为它在别的地方,而不影响系统上运行的程序的其余部分?
使用隔离/模拟框架 – 目前我所知道的唯一一个是目前处于测试阶段的隔离器++ ,我相信你可以从Typemock的好人那里获得一个副本。
签出_putenv_s和_tzset 。 理论上,你应该可以用_putenv_s来为你的进程设置TZ环境变量,然后使用_tzset来设置你的进程的实际本地时区为TZ环境变量的设置。
我知道这在putenv和tzset的 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
声明。 可悲的是,我还没有找到埃及的语言/国家字符串,但也许这给你一个提示。
我有完全一样的要求:
– >一些进程必须坚持UTC和其他一些不同于Windows系统时区的时区
经过数月的( 中断 )研究,我得出结论:在Windows上只能设置“UTC”或“当前”系统时区。 所以只有以下几点可以完成:
- 设定TZ =“UTC” - 取消TZ
安装一个钩子GetTimeZoneInformation,它会覆盖您自己的喜好的系统数据。
你见过SetTimeZoneInformation Win32 API函数吗?