如何在Delphi中使用DST将历史时间戳转换为不同的时区?

Joh*_*ohn 5 delphi timezone datetime dst

我需要在Delphi(Win32)中将历史时间戳从GMT转换为BST.我无法使用操作系统中的当前区域设置进行转换,因为它不具有历史时间的正确夏令时(DST)偏移.

我可以使用VCL API或Win32 API吗?

afr*_*ier 13

Delphi TZDB可能会有用.它的主要特点是有一个使用tz数据库处理时间的类,如果它包含"足够历史"数据,它将允许您使用UTC作为中介.tz数据库旨在为世界各地的所有时区制定规则,以及自Unix时代以来与UTC相关的闰年,夏令时,日历变更等各种时间变化(午夜,1月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;
Run Code Online (Sandbox Code Playgroud)

以上依赖于一些假设.首先,这GMTBST在TZ数据库的有效别名.如果没有,那么你需要找到最近的城市.(例如America/New_York).第二个是我非常确定我的代码是特定于Delphi XE +的.TZDB声称可以使用Delphi 6和更新版本(以及FreePascal),因此对工作的调整应该是次要的.

不幸的是,区域日期和时间非常复杂,特别是如果你在20世纪之前延伸很久.