加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:20:33 所属栏目:大数据 来源:网络整理
导读:参见英文答案 How to convert a historical timestamp to a different time zone with DST in Delphi?????????????????????????????????????1个 我的主题可能非常措辞,但这就是我所拥有的. 我有一个Web服务,它在本地时间报告时间戳,如果服务器在受影响的区域
参见英文答案 > How to convert a historical timestamp to a different time zone with DST in Delphi?????????????????????????????????????1个
我的主题可能非常措辞,但这就是我所拥有的.

我有一个Web服务,它在本地时间报告时间戳,如果服务器在受影响的区域,则时间戳反映日光时间. Web服务还有第二次调用以UTC格式检索服务器时间,因此太平洋夏令时(PDT)中的服务器将其UTC偏移量报告为-08:00,即使它因PDT而实际上是-07:00.

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

太平洋标准时间; -480;(UTC-08:00)太平洋时间(美国和加拿大);太平洋标准时间;太平洋夏令时; [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:00 am且UTC偏移是-08:00并且我住在亚利桑那州的白天时间免除区域,我的UTC偏移是-07:00怎么能我从返回的时间戳转换为当地时间?

这里的杀手是使用本地时间戳的Web服务.如果他们只是坚持一种通用格式,我的生活就会轻松.我目前的想法是,如果我可以在TTimeZone或等效结构中获取服务器的信息,那么我可以使用TTimeZone.IsDaylightTime(Timestamp)函数来知道我是否需要在使用-08:00服务器之前从时间戳中减去一个小时offset和-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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读