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



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

是否有一个VCL API或Win32 API我可以使用?

Delphi TZDB可能有用。它的主要功能是有一个类处理使用UTC数据库的时间,如果它包含"历史足够"的数据,将允许您使用UTC作为中介。tz数据库旨在为全球所有时区和各种时间变化(如闰年,夏令时,日历更改等)提供规则,因为它们与Unix纪元(Midnight, Jan 1, 1970)以来的UTC相关。

一旦你安装了这个包,用法就会像下面这样:

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;

以上依赖于几个假设。首先,GMTBST在tz数据库中是有效的别名。如果没有,那么你需要找到最近的城市。(如America/New_York)。第二,我很确定我的代码是Delphi XE+特有的。TZDB声称可以在Delphi 6及更新版本(和FreePascal)上工作,所以对工作的调整应该是很小的。

不幸的是,地区日期和时间非常复杂,特别是如果你追溯到20世纪之前。

相关内容

  • 没有找到相关文章