我需要在 Delphi (Win32) 中将历史时间戳从 GMT 转换为 BST。我无法使用操作系统中的当前区域设置进行转换,因为它没有历史时间的正确夏令时 (DST) 偏移量。
是否有我可以使用的 VCL API 或 Win32 API?
德尔福TZDB可能有用。它的主要特点是有一个类可以使用兹数据库,如果它包含“足够历史”的数据,则可以让您使用 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
and BST
是 tz 数据库中的有效别名。如果没有,那么您需要找到最近的城市。 (例如。America/New_York
)。第二个是我很确定我的代码是特定于 Delphi XE+ 的。 TZDB 声称可以在 Delphi 6 和更新版本(以及 FreePascal)上运行,因此对工作的调整应该很小。
不幸的是,地区日期和时间非常复杂,尤其是如果追溯到 20 世纪之前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)