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-го века.