4

私の主題はおそらくひどく言葉遣いされていますが、ここに私が持っているものがあります.

ローカル時間でタイムスタンプを報告する Web サービスがあり、サーバーが影響を受ける地域にある場合、タイムスタンプは夏時間を反映します。Web サービスには、UTC でサーバー時刻を取得するための 2 番目の呼び出しもあるため、太平洋夏時間 (PDT) のサーバーは、PDT のために事実上 -07:00 であっても、UTC オフセットを -08: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 サービスから返されたタイムスタンプが 2013 年 3 月 12 日午前 0 時で、UTC オフセットが -08:00 で、UTC オフセットが -07:00 であるアリゾナ州の夏時間免除地域に住んでいる場合、どうすればよいでしょうか返されたタイムスタンプを現地時間に変換しますか?

ここでのキラーは、タイムスタンプでローカル時間を使用する Web サービスです。彼らが普遍的なフォーマットに固執するだけなら、私の人生は楽になるでしょう. 私の現在の考えでは、TTimeZone または同等の構造でサーバーの情報を取得できれば、TTimeZone.IsDaylightTime(Timestamp) 関数を使用して、-08:00 サーバーを使用する前にタイムスタンプから 1 時間を減算する必要があるかどうかを知ることができます。 offset と -07:00 local offset を使用して、正しい現地時間を取得します。

4

1 に答える 1

7

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;
于 2013-03-12T17:11:18.603 に答える