C # TimeZoneInfo.ConvertTimeToUtc не соответствует другим инструментам преобразования времени - PullRequest
2 голосов
/ 21 марта 2011

Я выполняю этот фрагмент кода в LINQPad.

DateTime dt = new DateTime(2011, 2, 1,15,0,0);
dt.Dump();
TimeZoneInfo timeZoneId = TimeZoneInfo.FindSystemTimeZoneById("Samoa Standard Time");
//timeZoneId.GetAdjustmentRules().Dump();
var x = TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(dt, DateTimeKind.Unspecified), timeZoneId);
x.Dump();

Результат: 01.02.2011 15:00:00 02.02.2011 1:00:00

Когда я иду на Преобразователь времени по Гринвичу , чтобы проверить дважды, возвращаемое значение: 1.02.2011 2:00:00 AM. Почему функция .Net возвращает значение, отличное от другого сайта. Кто прав? Мы только что перешли на летнее время (я не проверял его перед переключением), это имеет значение?

Наш QA обнаружил список несоответствий:

ID  GMT Offset  Name                DateTime Tested     Conversion Result   Correct GMT
                                        (Value in DB)
16  -11:00      Samoa               2/1/2011 3:00 PM    2/2/2011 1:00 AM    2/2/2011 2:00 AM
19  +12:00      Auckland, Wellington 2/1/2011 3:00 PM   2/1/2011 2:00 AM    2/1/2011 3:00 AM
20  +12:00      Fiji                2/1/2011 3:00 PM    2/1/2011 2:00 AM    2/1/2011 3:00 AM
23  +10:00      Canberra,           2/1/2011 3:00 PM    2/1/2011 4:00 AM    2/1/2011 5:00 AM
                Melbourne, Sydney
25  +10:00      Hobart              2/1/2011 3:00 PM    2/1/2011 4:00 AM    2/1/2011 5:00 AM
27  +09:30      Adelaide            2/1/2011 3:00 PM    2/1/2011 4:30 AM    2/1/2011 5:30 AM
68  +01:00      Windhoek            2/1/2011 3:00 PM    2/1/2011 1:00 PM    2/1/2011 2:00 PM
80  -03:00      Brasilia            2/1/2011 3:00 PM    2/1/2011 5:00 PM    2/1/2011 6:00 PM
84  -03:00      Montevideo          2/1/2011 3:00 PM    2/1/2011 5:00 PM    2/1/2011 6:00 PM
88  -04:00      Cuiaba              2/1/2011 3:00 PM    2/1/2011 6:00 PM    2/1/2011 7:00 PM
89  -04:00      Santiago            2/1/2011 3:00 PM    2/1/2011 6:00 PM    2/1/2011 7:00 PM

1 Ответ

1 голос
/ 22 марта 2011

Оказывается, что это просто разница в DaylightSavingsTime (или их версии для этих стран. Если значение dt в примере изменяется на DateTime, то dt = new DateTime (2011, 4, 3,15,0,0);возвращенное время - 2:00, метод GetAdjusmentRules () показывает время перехода с 01.09.11 на 01.11.11, поэтому после 4/1 включается их версия DaylightSavingsTime.

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