gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:23:35 29 4
gpt4 key购买 nike

我的主题可能措辞很糟糕,但这就是我所拥有的。

我有一个 Web 服务,可以报告本地时间的时间戳,如果服务器位于受影响的区域,则时间戳反射(reflect)夏令时。该 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:00am 并且 UTC 偏移量是 -08:00 并且我住在亚利桑那州的夏令时豁免区域,其中我的 UTC 偏移量是 -07: 00 如何将返回的时间戳转换为本地时间?

这里的 killer 锏是在时间戳中使用本地时间的 Web 服务。如果他们坚持通用格式,我的生活就会很轻松。我当前的想法是,如果我可以在 TTimeZone 或等效结构中获取服务器的信息,那么我可以使用 TTimeZone.IsDaylightTime(Timestamp) 函数来了解是否需要在使用 -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;

关于Delphi - 获取非本地时区的 TTimeZone 并在时区之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15365842/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com