Windows API — gettimezoneинформация за год не возвращает правильную информацию за запрошенный год

#vba #windows #api

#vba #Windows #API

Вопрос:

Я пытаюсь реализовать набор классов и коллекций в VBA (Microsoft Access) для загрузки всех часовых поясов по всему миру и их исторической информации, чтобы выполнить вычисления для преобразования исторической даты и времени в UTC. Для этого я использую Windows API.

У меня есть EnumDynamicTimeZoneInformation и GetDynamicTimeZoneInformationEffectiveYears, которые, по-видимому, работают правильно.

Однако, когда я пытаюсь получить информацию за базовые годы с помощью GetTimeZoneInformationForYear, информация в возвращаемой структуре TIME_ZONE_INFORMATION, похоже, содержит только текущие значения для запрошенного часового пояса, но никогда значения из запрошенного года.

Сталкивался ли кто-нибудь еще с этой проблемой (независимо от языка программирования), и если да, то решили ли вы ее, и если да, то как вы это сделали?

ТИА

Отредактируйте, чтобы добавить объявления:

 Private Declare PtrSafe Function EnumDynamicTimeZoneInformation Lib "advapi32" (ByVal dwIndex As Long, lpTimeZoneInformation As tyAPI_DYNAMIC_TIME_ZONE_INFORMATION) As Long  Private Declare PtrSafe Function GetDynamicTimeZoneInformation Lib "kernel32" (pDynamicTimeZoneInformation As tyAPI_DYNAMIC_TIME_ZONE_INFORMATION) As Long  Private Declare PtrSafe Function GetDynamicTimeZoneInformationEffectiveYears Lib "advapi32" (pDynamicTimeZoneInformation As tyAPI_DYNAMIC_TIME_ZONE_INFORMATION, FirstYear As Long, LastYear As Long) As Long  Private Declare PtrSafe Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As tyAPI_TIME_ZONE_INFORMATION) As Long  Private Declare PtrSafe Function GetTimeZoneInformationForYear Lib "kernel32" (wYear As Integer, lpDynamicTimeZoneInformation As tyAPI_DYNAMIC_TIME_ZONE_INFORMATION, lpTimeZoneInformation As tyAPI_TIME_ZONE_INFORMATION) As Long  Public Type tyAPI_SYSTEMTIME  wYear As Integer  wMonth As Integer  wDayOfWeek As Integer  wDay As Integer  wHour As Integer  wMinute As Integer  wSecond As Integer  wMilliseconds As Integer End Type  Public Type tyAPI_TIME_ZONE_INFORMATION  Bias As Long  StandardName(0 To 31) As Integer  StandardDate As tyAPI_SYSTEMTIME  StandardBias As Long  DaylightName(0 To 31) As Integer  DaylightDate As tyAPI_SYSTEMTIME  DaylightBias As Long End Type  Public Type tyAPI_DYNAMIC_TIME_ZONE_INFORMATION  Bias As Long  StandardName(0 To 31) As Integer  StandardDate As tyAPI_SYSTEMTIME  StandardBias As Long  DaylightName(0 To 31) As Integer  DaylightDate As tyAPI_SYSTEMTIME  DaylightBias As Long  TimeZoneKeyName(0 To 127) As Integer  DynamicDaylightTimeDisabled As Long End Type  

Комментарии:

1. Верны ли ваши объявления API (32 против 64 бит)?

2. Отредактированная запись для добавления объявлений кода для функций и типов

3. Очевидно, что вы должны упомянуть год, часовой пояс и место, с которым у вас возникли проблемы. Помимо того, что вы использовали в качестве оракула, там много плохой информации. Но посмотри, чего ожидать, беги Regedit.exe и перейдите в раздел HKEY_LOCAL_MACHINE/ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ/Microsoft/Windows NT/Текущая версия/Часовые пояса. Зона «Стандартное время Израиля» — хорошая, правила-это политические переговоры каждый год. Это диапазон лет, который вы можете ожидать охватить (2004-2023), за годы до или после использования текущего правила. Google «База данных vba olson tz» для расширенного охвата.

4. Извините, я сегодня немного переживаю. TZ, который я использую для проверки, соответствует стандартному времени Фиджи, и я использовал записи реестра, чтобы он знал, что на моем компьютере с 2008 по 2029 год, и что первый и последний год, возвращенные getdynamictimezoneинформацияэффективные годы, верны.

5. Фиджи в 2008 году в реестре не имеет значений (все нули для Std и Dlt). В 2009 году 1-е чт в январе для Зппп и 5-е воскресенье ноября для Длт. Тем не менее, то, что поступает через TZI из Gettimezoneинформации за год, относится к основной записи TZ в реестре, 3-е воскресенье января для Std и 2-е воскресенье ноября для Dlt. (помня, что Фиджи находится в Южном полушарии, поэтому изменения противоположны корректировкам часового пояса Северного полушария по DST).