获取非本地时区的TTimeZone并在时区之间进行转换



我的主题可能措辞很糟糕,但这是我的内容。

我有一个web服务,它在本地时间报告时间戳,如果服务器在受影响的区域,时间戳反映夏令时。web服务还有第二个调用来检索UTC的服务器时间,因此太平洋夏令时(PDT)的服务器将其UTC偏移量报告为-08:00,尽管由于PDT,它实际上是-07:00。

这是我调用返回服务器的时区信息的结果。

(UTC-08:00)太平洋时间(US &加拿大),太平洋标准时间;太平洋夏令时;[01:01:0001;12:31:2006;60;[0;02:00:00;4、1 0;];[0;02:00:00;10;5。0;];][01:01:2007;12:31:9999;60;[0;02:00:00;3、2 0;];[0;02:00:00;11;1;0;];];

所以,如果从web服务返回的时间戳是3/12/2013 12:00am, UTC偏移量是-08:00,我住在亚利桑那州的日光豁免区域,我的UTC偏移量是-07:00,我如何从返回的时间戳转换到我的本地时间?

这里的杀手是在时间戳中使用本地时间的web服务。如果他们坚持一个通用的格式,我的生活会很容易。我目前的想法是,如果我能在TTimeZone或等效结构中获得服务器的信息,那么我可以使用TTimeZone. isdaylighttime(时间戳)函数来知道我是否需要从时间戳中减去一个小时,然后使用-08:00服务器偏移量和-07:00本地偏移量来获得正确的本地时间。

可以使用delphi-tzdb。伪代码:

uses
  ..., TZDB;
procedure Main;
var
  ServerTZID: string;
  TZ: TTimeZone;
  Stamp1, Stamp2: TDateTime;
begin
  // 1. retrieve server timezone info
  ServerTZID := ... // MyServer.GetTimezoneInfo; e.g. 'Pacific Standard Time';
  // look up the retrieved timezone
  TZ := TBundledTimeZone.GetTimeZone(ServerTZID); // nil if not found
  // 2. retrieve server timestamp
  Stamp1 := ... // MyServer.RetrieveTimestamp;
  // 3. convert to UTC and back to local timezone
  Stamp2 := TZ.Local.ToLocalTime(TZ.ToUniversalTime(Stamp1));
  Writeln(Format('%s %s -> %s %s', [FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', Stamp1),
    TZ.DisplayName, FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', Stamp2),
    TZ.Local.DisplayName]));
end;

相关内容

  • 没有找到相关文章

最新更新