Delphi - Tải TTimeZone cho múi giờ không thuộc địa phương và chuyển đổi giữa các múi giờ (Delphi - Get TTimeZone for non-local timezone and convert between timezones)


問題描述

Delphi ‑ Tải TTimeZone cho múi giờ không thuộc địa phương và chuyển đổi giữa các múi giờ (Delphi ‑ Get TTimeZone for non‑local timezone and convert between timezones)

My subject is probably terribly worded, but here's what I have.

I have a web service that reports timestamps in its local time and the timestamps reflect daylight time if the server is in an affected area. The web service also has a second call to retrieve the server time in UTC so a server in Pacific Daylight Time (PDT) reports its UTC offset as ‑08:00 even though it's effectively ‑07:00 because of PDT.

Here is the result of my call to return the server's timezone info.

Pacific Standard Time;‑480;(UTC‑08:00) Pacific Time (US & Canada);Pacific Standard Time;Pacific Daylight Time;[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;];];

So, if a timestamp returned from the web service is 3/12/2013 12:00am and the UTC offset is ‑08:00 and I live in a daylight time exempt area of Arizona where my UTC offset is ‑07:00 how can I convert from the returned timestamp to my local time? 

The killer here is the web service using local time in timestamps. If they would just stick to a universal format my life would be easy. My current thinking is if I can get the server's information in a TTimeZone or equivalent structure then I can use the TTimeZone.IsDaylightTime(Timestamp) function to know if I need to subtract an hour from the timestamp before then using the ‑08:00 server offset and ‑07:00 local offset to get my correct local time.


參考解法

方法 1:

You can use delphi‑tzdb. Pseudo‑code:

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;

(by Michael S.Ondrej Kelle)

參考文件

  1. Delphi ‑ Get TTimeZone for non‑local timezone and convert between timezones (CC BY‑SA 3.0/4.0)

#utc #delphi #timezone #dst






相關問題

Java - 從外部服務器獲取 POSIX UTC 時間戳的最佳選擇? (Java - Best choice to get a POSIX UTC timestamp from external server?)

PHP - Параўнанне лакальнага і UTC часу са зрушэннем гадзіннага пояса (PHP - Local vs UTC Time Comparison with Timezone Offset)

以 UTC 格式轉換日期時間 (Convert date time in utc)

如何確定日期字符串是否包含已在 Javascript 中添加的時間偏移量? (How to figure out if the Date string contains time offset added already in Javascript?)

Delphi - Tải TTimeZone cho múi giờ không thuộc địa phương và chuyển đổi giữa các múi giờ (Delphi - Get TTimeZone for non-local timezone and convert between timezones)

什麼是“標準”時區縮寫? (What are the "standard" timezone abbreviations?)

如何從包含 Oracle 中時區偏移的日期/時間字符串中獲取 UTC 日期/時間 (How to get UTC date/time from a date/time string that contains timezone offset in Oracle)

如何在不使用 Javascript 的情況下在 ASP.Net 中呈現給定 UTC 日期時間值的本地時間? (How to render local time given UTC datetime values in ASP.Net without using Javascript?)

如何讓 Java 解析和格式化具有相同時區的日期/時間?我一直在獲取本地時區 (How do I get Java to parse and format a date/time with the same time zone? I keep getting the local timezone)

Python - 從 DST 調整的本地時間到 UTC (Python - From DST-adjusted local time to UTC)

7 位小數計算的 UTC 時間 (UTC time with 7 decimals calculation)

我們應用程序中的日期格式 (Date format in our Application)







留言討論