Определите, действует ли переход на летнее время для определенного часового пояса в VBA - PullRequest
2 голосов
/ 16 марта 2020

Я пытаюсь написать функцию, которая преобразует время между часовыми поясами.

Например:

convertedTime = TimezoneConvert("15/03/2020 12:00", "Central Standard Time", "Turkey Standard Time")

Теперь ... до сих пор работает так, что это циклы через ключ каждого часового пояса в реестре (HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones) и считывает строковые значения "Std" и "Dlt". Как только он находит соответствующую строку для указанного параметра часового пояса, он заполняет объект TIME_ZONE_INFORMATION соответствующими данными.

Private Type TIME_ZONE_INFORMATION
    Bias As Long
    StandardName(0 To 31) As Integer
    StandardDate As SYSTEMTIME
    StandardBias As Long
    DaylightName(0 To 31) As Integer
    DaylightDate As SYSTEMTIME
    DaylightBias As Long
End Type

Затем он использует информацию в этом объекте для преобразования.

Функция в настоящее время работает для перехода на летнее время, но пользователь должен знать, что она действует, и вызывать функцию следующим образом:

convertedTime = TimezoneConvert("15/03/2020 12:00", "Central Summer Time", "Turkey Standard Time")

Мне просто интересно, есть ли что-нибудь в в реестре или на самом windows, который определяет, действует ли на данный момент часовой пояс, такой как «Центральное стандартное время», на летнее время? Таким образом, я могу изменить код таким образом, чтобы, если в качестве параметра было введено «Центральное стандартное время», оно могло возвращать правильное время с применением перехода на летнее время.

Если нет, у кого-нибудь есть какие-либо предложения как это может быть достигнуто?

Я взглянул на windows API-метод GetTimeZoneInformation, но, похоже, он возвращает объект часового пояса только для локального времени на машине.

Я знаю, что вы можете сделать это с объектом outlook, используя метод .ConvertTime, однако это приложение может быть установлено на компьютерах, где outlook отсутствует.

1 Ответ

0 голосов
/ 17 марта 2020

Мне просто интересно, есть ли что-нибудь в реестре

Да. Вы можете проверить ключ в HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones. Под ним будет подключ, если часовой пояс поддерживает DST. Вы можете попытаться открыть подраздел указанного часового пояса, и если не удается найти подраздел, значение SupportsDaylightSavingTime равно true. enter image description here

...