Я создаю проект c++, который должен работать в нескольких часовых поясах. Приложение получает событие с эталонным часовым поясом, и это событие отображается графически пользователю в нужный час в его локальном часовом поясе. Например, пользователь, работающий в Берлине, получает событие, написанное в Токио. Событие из Токио сначала преобразуется в UTC, а затем переводится с UTC на локальное время компьютера в Берлине и, наконец, отображается пользователю на его графическом интерфейсе.
Чтобы конвертировать из UTC в локальное компьютерное время, у меня есть несколько функций API Windows, которыми я располагаю, чтобы выполнить эту работу. Но чтобы преобразовать время из другого часового пояса в UTC, мне нужно получить информацию о часовом поясе из реестра Windows.
Теперь некоторые часовые пояса также имеют время перехода на летнее время. Я могу создать правило повторения из информации Windows без проблем. Однако я заметил, что в день, когда должен произойти DST, иногда бывает некорректно в течение нескольких часовых поясов. Например, "Стандартное время в Южной Америке". С появлением Windows, начальный день DST начинается на 1 неделю раньше.
Если я правильно понял, правило возврата, возвращаемое Windows для этого конкретного часового пояса, говорит "каждый год, во второй месяц, на вторую неделю месяца". Однако это правило редко совпадает с правильной датой, опубликованной в Интернете, для изменения времени, тогда как даты являются правильными, если правило будет "каждый год, на 2-й месяц, на 3-й неделе месяца". Кроме того, как вы можете видеть на приведенном скриншоте, данные реестра Windows показывают 2 недели для времени начала DST (выделено синим цветом), но 3 недели для конечного времени DST (окружено красным), которое правильно вычисляется по моему коду, Описание содержимого данных можно найти здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx
У меня есть несколько вопросов
- Правильно ли я понял правило повторения? (Вот что говорит MSDN об этом: https://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx)
- Известны ли проблемы по нескольким часовым поясам, особенно по "Единому времени в Южной Америке"?
- Есть ли причина, по которой дата начала летнего времени, которая, очевидно, происходит регулярно каждый год, на третьей неделе 10-го месяца, имеет значение, установленное на 2-й неделе?
- Является ли часовой пояс, написанный в реестре Windows надежным, если нет, какую функцию Windows API я должен использовать для преобразования часового пояса с DST с даты, написанной в другом часовом поясе, чем тот, который установлен на локальной машине?
ПРИМЕЧАНИЕ. Я строго проверял, были ли данные, которые я прочитал из реестра, были правильными, прежде чем отправлять это сообщение. Я уверен, что это не ошибка такого типа.
ПРИМЕЧАНИЕ. Я работаю с Windows 7, но проблема остается такой же на Windows 10