簡體   English   中英

Windows程序如何暫時更改其時區?

[英]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的優秀人員索取一個來獲得副本。

查看_putenv_s_tzset 從理論上講,你應該能夠設置TZ環境變量與_putenv_s的過程,然后用_tzset為您的過程中的實際本地時區設置什么TZ環境變量設置為。

我知道這可以在Linux上使用putenvtzset ,並且從_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”或“當前”系統時區。 所以只能做以下事情:

- set TZ="UTC" 
     - unset TZ

為GetTimeZoneInformation安裝一個鈎子,它用你自己的首選項覆蓋系統數據。

你見過SetTimeZoneInformation Win32 API函數嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM