OpenNETCF TimeZoneCollection получает данные непосредственно из ОС, ничего не делает, а действует как маршалер данных. Если вы видите неправильные смещения DST, даты DST или смещения TZ, это происходит из-за того, что в вашей ОС они определены неправильно.
В этом нет ничего необычного, особенно если учесть, что разные части мира периодически меняют определения для расчетов по местному времени, а сборка ОС не подозревает, что это произошло. Существует множество устройств CE 5.0 и более ранних версий, которые по-прежнему неправильно рассчитывают даты изменения летнего времени в США из-за этого.
Решение состоит в том, чтобы обновить устройство с помощью встроенной ОС с правильными определениями.
Теперь, если вы видите проблему, когда вы устанавливаете TimeZone на что-то вроде «UTC +1 PlaceA» и возвращаете «UTC +1 PlaceB», тогда я думаю, что это известная проблема (я думаю, что я вспоминаю некоторые вопросы по в любом случае, за последние 5 лет) потому что в операционной системе это вообще плохо обрабатывается. Достаточно взглянуть на источник:
public static void SetTimeZoneInformation( TimeZoneInformation tzi )
{
// Call CE function (implicit conversion occurs to
// byte[]).
if (!NativeMethods.SetTimeZoneInformation(tzi))
{
throw new System.ComponentModel.Win32Exception(
Marshal.GetLastWin32Error(), "Cannot Set Time Zone");
}
}
Как видите, мы просто передаем TZI, извлеченный из устройства (из реестра в случае не WinMo) и собранный в классе TimeZoneCollection (начиная со строки 129).
В созданном нами решении, которое должно было обрабатывать часовые пояса, летнее время и т. Д., Мы фактически написали наш собственный сервис, который обрабатывал все вычисления DST / TZ. Мы использовали ОС для хранения GMT и ничего больше, затем сделали все смещения вручную. Продукт продается несколькими курьерами, покрывающими несколько часовых поясов, и мы не слышали о проблемах (и, поскольку это время, любые проблемы со временем станут очевидными очень быстро).