Как преобразовать историческую временную метку в другой часовой пояс с помощью летнего времени в Delphi? - PullRequest
5 голосов
/ 12 октября 2011

Мне нужно преобразовать историческую метку времени из GMT в BST в Delphi (Win32). Я не могу использовать текущие региональные настройки в ОС, чтобы выполнить преобразование, потому что у него не будет корректного смещения для летнего времени (DST) за историческое время.

Могу ли я использовать VCL API или Win32 API?

1 Ответ

13 голосов
/ 12 октября 2011

Delphi TZDB может быть полезным.Его главная особенность в том, что у него есть класс, который обрабатывает время, используя базу данных tz , которая, если она содержит «достаточно исторические» данные, позволит вам использовать UTC в качестве посредника.База данных tz стремится иметь правила для всех часовых поясов по всему миру и различных временных сдвигов для таких вещей, как високосные годы, переход на летнее время, изменения в календаре и т. Д., Поскольку они относятся к UTC со времен Unix (полночь, 1 января,1970).

После установки пакета использование будет примерно таким:

function ConvertFromGMTToBST(const AGMTTime: TDateTime): TDateTime;
var
   tzGMT, tzBST: TTimeZone;
   UTCTime: TDateTime;
begin
    tzGMT := TBundledTimeZone.GetTimeZone('GMT');
    tzBST := TBundledTimeZone.GetTimeZone('BST');
    UTCTime := tzGMT.ToUniversalTime(AGMTTime);
    Result := tzBST.ToLocalTime(UTCTime);
end;

Вышеприведенное опирается на несколько предположений.Прежде всего, что GMT и BST являются действительными псевдонимами в базе данных tz.Если нет, то вам нужно будет найти ближайшие города.(например, America/New_York).Во-вторых, я уверен, что мой код специфичен для Delphi XE +.TZDB утверждает, что работает на Delphi 6 и новее (и FreePascal), поэтому корректировка работы должна быть незначительной.

К сожалению, региональные даты и время очень сложны, особенно если вы уходите намного раньше 20-го века.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...