【问题标题】:How to convert a historical timestamp to a different time zone with DST in Delphi?如何在 Delphi 中使用 DST 将历史时间戳转换为不同的时区?
【发布时间】:2011-12-05 17:53:09
【问题描述】:

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

是否有我可以使用的 VCL API 或 Win32 API?

【问题讨论】:

  • 欢迎来到 StackOverflow。您能否更具体地说明“历史时间戳”的含义? “历史”是什么意思?一年前?十年前?一百?五百?一千? (请记住,在提问时,我们只有您提供的信息才能继续。您对所需内容的了解越具体,您就越有可能很快得到答案。):)
  • 好点,肯。我需要满足 2011 年以后的日期。

标签: delphi datetime timezone dst


【解决方案1】:

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;

以上内容依赖于一些假设。首先,GMTBST 是 tz 数据库中的有效别名。如果没有,那么您需要找到最近的城市。 (例如America/New_York)。第二个是我很确定我的代码是 Delphi XE+ 特定的。不过,TZDB 声称可以在 Delphi 6 和更新版本(以及 FreePascal)上工作,因此对工作的调整应该很小。

不幸的是,地区日期和时间非常复杂,尤其是如果您可以追溯到 20 世纪之前。

【讨论】:

  • @afrazier 此解决方案是否针对当地时间调整 DST,例如 EST 与 EDT
  • @Hogan:我不是 100% 确定,但似乎不是。如果您使用的是 EST 或 EDT 区域,它们将直接为 -5 UTC 或 -4 UTC。使用 America/New_York 处理转换。
  • @afrazier - 对,但应该是任何给定的本地是否是 DST。我见过的其他示例即使使用像 America/New_York 这样的本地也不能解决这个问题。仍在寻找一个可行的例子。
  • @Hogan:我的理解是,通过使用本地,TZDB API 可以告诉您特定时间戳的 UTC 偏移量是多少。如果不是这种情况,那么您最好提交一个新问题,展示您正在尝试解决的问题以及到目前为止您所做的没有奏效的事情。我已经离开 Delphi 几年了,但我会使用类似于我在 C# 中的答案的东西。
  • @afrazier - 实际上我没有使用 Delphi,我正在使用 TZDB 处理其他系统 - 感谢您的帮助,我现在已经控制住了。 (我希望)。
猜你喜欢
  • 2013-04-15
  • 2015-04-20
  • 2020-10-17
  • 2018-08-08
  • 2019-10-07
  • 2019-02-22
  • 2021-09-22
  • 1970-01-01
  • 2011-09-23
相关资源
最近更新 更多