2013-11-28 2 views
3

Я работаю над изменением системного часового пояса из приложения WPF. Для этого я использую неуправляемый код, который я нашел на этом сайте: changing time zones. Он меняет мой часовой пояс. Однако, когда я нажимаю на окна, я вижу сообщение: «Ваш текущий часовой пояс не распознается. Выберите действующий часовой пояс, используя ссылку ниже». Я мог себе представить, что есть какая-то небольшая разница. Я проанализировал один часовой пояс - как он представлен перед программным изменением и после.Как программно изменить системный часовой пояс

ДО:

BaseUtcOffset: 4:00:00:00 
Daylight Name: "Arabian Daylight Time" 
Display Name: "(UTC +4:00) Abu Dhabi, Muscat" 
Id: "Arabian Daylight Time" 
Standard Name: "Arabian Daylight Time" 
SupportsDaylightSavingTime: false 

после:

BaseUtcOffset: -4:00:00:00 
Daylight Name: "" 
Display Name: "Arabian Daylight Time" 
Id: "Arabian Daylight Time" 
Standard Name: "Arabian Daylight Time" 
SupportsDaylightSavingTime: false 

Я не нашел способ, чтобы установить "Display Name" с помощью TIME_ZONE_INFORMATION. Итак, что-то, что он называется «(UTC +4: 00) Абу-Даби, Маскат» на графическом интерфейсе, когда пользователь вручную изменил его с помощью Windows, теперь он называется «Arabian Daylight Time». Возможно, эти различия являются одной из причин, почему я вижу сообщение «Ваш текущий часовой пояс ...». Я читал где-то еще, что перезагрузка помогает, и это сообщение исчезает - к сожалению, после перезагрузки ничего не меняется.

+0

Как вы получили «-4: 00: 00: 00' (United States Eastern Daylight Time) от' +4: 00: 00: 00'? – Gabe

+0

Я заметил это, конечно. это может быть ошибка в методе, который создает TimeZoneInformation на основе TimeZoneInfo. Однако это ничего не меняет, когда дело доходит до вопроса, который у меня есть. Зачем? потому что я использовал один раз метод GetTimeZoneInformation - я записал все значения внутри структуры и в следующий раз, когда я прошел ТОЧНО одни и те же значения. но у меня было сообщение «ваш текущий часовой пояс ...». – user3046525

ответ

1

Хорошо. Я нашел свою ошибку. Проблема заключалась в том, что в Windows 7 я пытался изменить часовой пояс с:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
private static extern bool SetTimeZoneInformation([In] ref TimeZoneInformation lpTimeZoneInformation); 

в то время как я должен был использовать:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
private static extern bool SetDynamicTimeZoneInformation([In] ref DynamicTimeZoneInformation lpTimeZoneInformation); 

Использование DYNAMIC_TIME_ZONE_INFORMATION решить большинство проблем в отношении моей текущей задачи.

Смежные вопросы