我需要在Delphi(Win32)中将历史时间戳从GMT转换为BST。我无法使用操作系统中的当前区域设置进行转换,因为它在历史时间内没有正确的夏令时(DST)偏移量。
我可以使用VCL API或Win32 API吗?
答案 0 :(得分:13)
Delphi TZDB可能有用。它的主要特点是有一个使用tz database处理时间的类,如果它包含“足够历史”的数据,它将允许您使用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;
以上依赖于一些假设。首先,GMT
和BST
是tz数据库中的有效别名。如果没有,那么你需要找到最近的城市。 (例如America/New_York
)。第二个是我非常确定我的代码是特定于Delphi XE +的。 TZDB声称可以使用Delphi 6和更新版本(以及FreePascal),因此对工作的调整应该是次要的。
不幸的是,区域日期和时间非常复杂,特别是如果你在20世纪之前退缩很久。