我需要将历史时间戳从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;
以上依赖于几个假设。首先,GMT
和BST
在tz数据库中是有效的别名。如果没有,那么你需要找到最近的城市。(如America/New_York
)。第二,我很确定我的代码是Delphi XE+特有的。TZDB声称可以在Delphi 6及更新版本(和FreePascal)上工作,所以对工作的调整应该是很小的。
不幸的是,地区日期和时间非常复杂,特别是如果你追溯到20世纪之前。