#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).