【问题标题】:Convert UTC string to TDatetime in Delphi在 Delphi 中将 UTC 字符串转换为 TDatetime
【发布时间】:2009-10-20 22:54:07
【问题描述】:
var
  tm : string;
  dt : tdatetime;

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

我知道我可以手动解析它,但我想知道是否有任何内置函数或 Win32 API 函数可以做到这一点?

【问题讨论】:

  • 最终编写了自己的课程来处理这个问题,并且要完全符合标准,这是一个相当复杂的课程。会对此问题的任何更快的解决方案感兴趣。
  • “标准”是 ISO 8601
  • 使用 DateUtils 中内置的 ISO 8601 函数:TryISO8601ToDate

标签: delphi utc tdatetime


【解决方案1】:

我不知道为什么有这么多人在不知道他们在说什么的时候就开枪了?我必须做这些琐碎的工作;它是 RAD 工具吗?不过,我有时会发现 Delphi 的架构非常出色。

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

【讨论】:

  • 1) 你覆盖了全局格式变量,这是一件坏事。考虑使用线程安全的例程。 2)您忽略时区。 3) 虽然 trunc() 和 frac() 目前有效,但未来可能会发生变化。改用 DateOf() 和 TimeOf() 可以使代码更加便携和清晰。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      相关资源
      最近更新 更多