[英]How can a Windows program temporarily change its time zone?
我寫了一個函數來返回對應於給time_t
午夜的time_t
值。 當某一天沒有午夜時,它會返回最早的可用時間; 例如,當埃及進入夏令時時,就會發生這種情況。 今年,時間變更將於4月29日晚上午夜生效,因此時鍾從23:59直接到01:00。
現在我正在為這個函數編寫單元測試,其中一個測試應該復制埃及場景。 在Unix中,我可以像這樣完成它:
putenv("TZ", "Egypt", true);
tzset();
在這之后,對localtime
進一步調用就好像他們在埃及而不是明尼蘇達,我的測試通過了。 但是,僅僅設置環境變量對Windows沒有任何影響。 如果不影響系統上運行的其他程序,我該怎么做才能讓單元測試認為它在其他地方?
使用Isolation / Mocking框架 - 我目前唯一知道的是Isolator ++目前處於測試階段,我相信你可以通過向Typemock的優秀人員索取一個來獲得副本。
請不要調用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”或“當前”系統時區。 所以只能做以下事情:
- set TZ="UTC" - unset TZ
為GetTimeZoneInformation安裝一個鈎子,它用你自己的首選項覆蓋系統數據。
你見過SetTimeZoneInformation Win32 API函數嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.