Как программа Windows может временно изменить свой часовой пояс? - PullRequest
11 голосов
/ 10 апреля 2010

Я написал функцию, которая возвращает значение time_t, соответствующее полуночи данного дня. Если для данного дня нет полуночи, он возвращает самое раннее доступное время; такая ситуация может возникнуть, например, когда в Египте наступает переход на летнее время. В этом году изменение времени вступает в силу в полночь ночи 29 апреля, поэтому часы идут с 23:59 до 01:00.

Сейчас я пишу модульные тесты для этой функции, и один из тестов должен повторить сценарий Египта. В Unix я могу сделать это так:

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

После этого дальнейшие звонки на localtime ведут себя так, как будто они в Египте, а не в Миннесоте, и мои тесты проходят. Однако простая установка переменной среды не оказывает никакого влияния на Windows. Что я могу сделать, чтобы заставить модульный тест думать, что он где-то еще, не затрагивая остальные программы, работающие в системе?

Ответы [ 8 ]

3 голосов
/ 27 сентября 2010

Использование Isolation / Mocking Framework - единственное, что я знаю на данный момент, это Isolator ++ , который в настоящее время находится в бета-версии. Я уверен, что вы можете получить копию, попросив одну из хороших людейTypemock.

2 голосов
/ 30 ноября 2010

Пожалуйста, не вызывайте SetTimeZoneInformation - в Windows нет понятия о часовом поясе для потока или процесса. Как говорят другие, самый простой способ - макетировать код часового пояса - с помощью Pex / Mocks вы можете макетировать даже статические методы, что означает, что вы можете подключить стандартный код .NET Timezone, чтобы заменить его своим. Если вы используете C / C ++, вам просто нужно подключить код, чтобы информация TZ была поддельной.

2 голосов
/ 30 ноября 2010

Выезд _putenv_s и _tzset . Теоретически вы должны иметь возможность установить переменную окружения TZ для вашего процесса с помощью _putenv_s , а затем использовать _tzset , чтобы установить фактический часовой пояс для вашего процесса. значение переменной окружения TZ .

Я знаю, что это работает в Linux с putenv и tzset , и из документации _putenv_s и _tzset , похоже что вы должны быть в состоянии сделать то же самое с ними в Windows. Хотя я на самом деле не пробовал.

1 голос
/ 10 декабря 2014

С VS 2008 (C ++ native) я смог изменить поведение localtime(), изменив переменную _timezone.

Я согласен, это не совсем чистый способ, но, по крайней мере, это может быть обходной путь.

Конечно, вам нужно самостоятельно выполнить математику, чтобы определить количество секунд между UTC и вашим «новым» часовым поясом.

0 голосов
/ 17 декабря 2011

Установите хук к GetTimeZoneInformation, который переопределяет системные данные с вашими предпочтениями.

0 голосов
/ 05 мая 2010

У меня точно такое же требование:

-> некоторые процессы должны быть привязаны к UTC, а другие - к другому часовому поясу, отличному от системного часового пояса Windows

После нескольких месяцев изучения ( прервано ) я пришел к выводу, что в Windows можно установить только «UTC» или «текущий» часовой пояс системы. Таким образом, может быть сделано только следующее:

     - set TZ="UTC" 
     - unset TZ
0 голосов
/ 10 апреля 2010

Я использовал setlocale(LC_ALL, "deu_aut") для переключения настроек языка / страны на Австрию - объявлено в locale.h. К сожалению, я не нашел строку языка / страны для Египта, но, возможно, это дает вам подсказку.

0 голосов
/ 10 апреля 2010

Вы видели функцию API SetTimeZoneInformation Win32?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...