如何在Delphi中使用DST将历史时间戳转换为不同的时区?
我需要在Delphi(Win32)中将历史时间戳从GMT转换为BST。我无法使用操作系统中的当前区域设置进行转换,因为它没有正确的夏令时(DST)历史时间偏移 我可以使用VCL API或Win32 API吗 可能有用。它的主要功能是有一个类,该类使用处理时间,如果它包含“足够多的历史”数据,则可以使用UTC作为中介。tz数据库旨在为世界各地的所有时区以及闰年、夏令时、日历更改等的各种时移制定规则,因为它们自Unix纪元(1970年1月1日午夜)起就与UTC相关 安装软件包后,使用方法如下:如何在Delphi中使用DST将历史时间戳转换为不同的时区?,delphi,datetime,timezone,dst,Delphi,Datetime,Timezone,Dst,我需要在Delphi(Win32)中将历史时间戳从GMT转换为BST。我无法使用操作系统中的当前区域设置进行转换,因为它没有正确的夏令时(DST)历史时间偏移 我可以使用VCL API或Win32 API吗 可能有用。它的主要功能是有一个类,该类使用处理时间,如果它包含“足够多的历史”数据,则可以使用UTC作为中介。tz数据库旨在为世界各地的所有时区以及闰年、夏令时、日历更改等的各种时移制定规则,因为它们自Unix纪元(1970年1月1日午夜)起就与UTC相关 安装软件包后,使用方法如下: fu
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;
上述情况取决于几个假设。首先,在tz数据库中,GMT
和BST
是有效的别名。如果没有,那么你需要找到最近的城市。(例如,美国/纽约)。第二点是,我非常确定我的代码是Delphi XE+特定的。TZDB声称可以在Delphi 6和更新版本(以及FreePascal)上工作,因此对工作的调整应该很小
不幸的是,地区日期和时间非常复杂,特别是如果你追溯到20世纪以前。欢迎来到StackOverflow。你能更具体地解释一下“历史时间戳”是什么意思吗?“历史”是什么意思?一年前?十年前?一百?五百?一千?(记住,当你问问题时,我们只知道你提供的信息。你对你需要的越具体,你越有可能很快得到答案。):)说得好,肯。我需要考虑从2011年起的日期。@afrazier此解决方案是否针对当地时间的DST进行调整,例如EST vsEDT@Hogan当前位置我不是100%确定,但似乎不是。如果您使用的是区域EST或EDT,它们将直接为-5 UTC或-4 UTC。使用America/New_York来处理转换。@afrazier-对,但任何给定的本地都应该是DST或不是DST。我看到的其他例子并不能解决这一问题,即使他们使用的是像美国/纽约这样的本地网站。仍然在寻找一个有效的例子。@Hogan:我的理解是,通过使用本地,TZDB API可以告诉您特定时间戳的UTC偏移量是多少。如果情况并非如此,那么你最好提交一个新问题,说明你正在试图解决的问题以及你迄今为止所做的没有奏效的事情。我已经离开Delphi好几年了,但我会使用类似于我在C#中的答案的东西。@afrazier-实际上我没有使用Delphi,我正在使用TZDB与其他系统合作——谢谢你的帮助,我现在已经控制住了。(我希望如此)。