Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi中使用DST将历史时间戳转换为不同的时区?_Delphi_Datetime_Timezone_Dst - Fatal编程技术网

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

如何在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

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

我可以使用VCL API或Win32 API吗

可能有用。它的主要功能是有一个类,该类使用处理时间,如果它包含“足够多的历史”数据,则可以使用UTC作为中介。tz数据库旨在为世界各地的所有时区以及闰年、夏令时、日历更改等的各种时移制定规则,因为它们自Unix纪元(1970年1月1日午夜)起就与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;
上述情况取决于几个假设。首先,在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与其他系统合作——谢谢你的帮助,我现在已经控制住了。(我希望如此)。