Изменение TimeZone не отражает изменения во времени в .NET Compact Framework - PullRequest
1 голос
/ 31 августа 2011

Я работаю над приложением .Net Compact Frmework (CF). Для этого приложения требуется, чтобы я мог изменять TimeZone. Однако, когда я изменил часовой пояс, текущее время не изменилось на этот конкретный часовой пояс. Из Интернета я узнал, что DateTime.Now не может работать в этом случае.

Я использую следующий Win API:

  1. SetTimeZoneInformation(...) - установка часового пояса во время выполнения.
  2. GetLocalTime(...) - Получить местное время по текущему времени. зона.

Кто-нибудь может сказать мне, что может быть не так?

Ответы [ 3 ]

5 голосов
/ 31 августа 2011

Изменение часового пояса из приложения таким способом не меняет местное время: вместо этого оно меняет системное время, чтобы сохранить местное время таким же.Это не то, что делает панель управления, но если вы хотите эмулировать функциональность панели управления, вам нужно сделать что-то вроде этого:

  • сохранить системное время
  • изменить часовой пояс
  • восстановить сохраненное системное время

Таким образом, системное время остается неизменным, а местное время изменяется в соответствии с выбранным часовым поясом.

Кстати, мыСделайте это в одном из наших продуктов, используя библиотеку OpenNETCF (http://www.opennetcf.com),, которая включает в себя класс DateTimeHelper (среди многих других полезных вещей - и выпуск для сообщества бесплатный). (Это просто немного лучше, чем написание вашегособственный пинвоук для доступа SetTimeZoneInformation(), функциональность та же.)

3 голосов
/ 07 ноября 2012

У меня та же проблема. В моем случае, чтобы изменить TimeZone без изменения времени, я использовал этот код:

DateTime dateTime = DateTime.Now;
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
TimeSpan currentOffset = timeZone.BaseUtcOffset.Duration();
DateTimeOffset offset = new DateTimeOffset(dateTime, currentOffset);

У меня есть GMT + 2 TimeZone. Например, 7.11.2012 14:00 +02: 00.

После использования этого кода у меня GMT + 1 с тем же временем. 11.11.2012 14:00 +01: 00.

3 голосов
/ 31 августа 2011

Это сделано по замыслу, он избегает кода, который зависит от постоянно увеличивающихся часов от перенесенного сердечного приступа. Обходной путь должен вызывать CultureInfo.CurrentCulture.ClearCachedData () явно после изменения часового пояса. Или перезапустите приложение.

...