Почему моя структура TIME_ZONE_INFORMATION содержит неверную дату перехода на летнее время?

Объявление службы общественной информации: в эти выходные на большей части территории Соединенных Штатов производится переход на летнее время. В других странах мира дата перехода на летнее время может отличаться от даты перехода в Соединенных Штатах Америки.

Клиент сообщил, что функция GetTimeZoneInformationForYear возвращает им некорректные значения.

У меня есть программа, которая вызывает функцию GetTimeZoneInformationForYear и, похоже, что эта функция возвращает неверные даты перехода на летнее время. К примеру, вызов GetTimeZoneInformationForYear(2010, NULL, &tzi) возвращает в поле tzi.DaylightDate второе марта вместо ожидаемого 14 марта. Текущий часовой пояс — тихоокеанское время.

Значение, возвращаемое функцией GetTimeZoneInformationForYear (а также функцией GetTimeZoneInformation) верно, вы просто неверно его интерпретируете.

Как сказано в документации по структуре TIME_ZONE_INFORMATION, значение поля wDay компонентов StandardDate и DaylightDate различно в случаях, когда значение wYear равно нулю и когда оно отлично от нуля.

Если значение wYear не равно нулю, поле wDay имеет свой обычный смысл.

Но если значение wYear равно нулю (а оно равно нулю для большинства часовых поясов), тогда в поле wDay будет храниться порядковый номер недели перевода часов на летнее/зимнее время, а не номер дня.

Другими словами, значение, равное двум, означает не «второе марта». Оно означает «вторая неделя марта».