在Delphi中将UTC字符串转换为TDatetime

Convert UTC string to TDatetime in Delphi

1
2
3
4
5
6
var
  tm : string;
  dt : tdatetime;

tm := '2009-08-21T09:11:21Z';
dt := ?

我知道我可以手动解析它,但我想知道是否有任何内置函数或Win32 API函数来执行此操作?


我不知道为什么当他们不知道他们在谈论什么时会有这么多人开枪? 我必须做这个卑鄙的工作; 它是RAD工具吗? 我有时会发现Delphi有一个非常棒的架构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
procedure setISOtoDateTime(strDT: string);
var
  // Delphi settings save vars
  ShortDF, ShortTF : string;
  TS, DS : char;
  // conversion vars
  dd, tt, ddtt: TDateTime;
begin
  // example datetime test string in ISO format
  strDT := '2009-07-06T01:53:23Z';

  // save Delphi settings
  DS := DateSeparator;
  TS := TimeSeparator;
  ShortDF := ShortDateFormat;
  ShortTF := ShortTimeFormat;

  // set Delphi settings for string to date/time
  DateSeparator := '-';
  ShortDateFormat := 'yyyy-mm-dd';
  TimeSeparator := ':';
  ShortTimeFormat := 'hh:mm:ss';

  // convert test string to datetime
  try

    dd := StrToDate( Copy(strDT, 1, Pos('T',strDT)-1) );
    tt := StrToTime( Copy(strDT, Pos('T',strDT)+1, 8) );
    ddtt := trunc(dd) + frac(tt);

  except
    on EConvertError do
      ShowMessage('Error in converting : ' + strDT);
  end;

  // restore Delphi settings
  DateSeparator := DS;
  ShortDateFormat := ShortDF;
  TimeSeparator := TS;
  ShortTimeFormat := ShortTF;

  // display test string
  ShowMessage ( FormatDateTime('mm/dd/yyyy hh:mm:ss', ddtt) );
end;

http://coding.derkeiler.com/Archive/Delphi/comp.lang.pascal.delphi.misc/2006-08/msg00190.html


如果您使用的是Indy 10,则其StrInternetToDateTime()GMTToLocalDateTime()函数(在IdGlobalProtocols单元中)可以解析ISO-8601格式的字符串。


这看起来像是与Internet协议相关的活动,因此您在使用Win32 API时应该没有任何问题。 但请注意,对于超过大约20年的历史日期,Windows无法正确支持与UTC的转换 - Windows在其时区设置中根本没有足够的详细信息。