Преобразование строки UTC в TDatetime в Delphi

var
  tm : string;
  dt : tdatetime;

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

Я знаю, что могу разобрать его вручную, но мне интересно, есть ли для этого какая-либо встроенная функция или функция Win32 API?


person Irwan    schedule 20.10.2009    source источник
comment
Закончилось тем, что я написал свой собственный класс, чтобы справиться с этим, и чтобы полностью соответствовать стандарту, это было довольно сложно. Были бы заинтересованы в более быстрых решениях этого вопроса.   -  person    schedule 21.10.2009
comment
«Стандарт» — ISO 8601.   -  person    schedule 21.10.2009
comment
Связанный вопрос: stackoverflow.com/questions/1438870/   -  person mghie    schedule 21.10.2009
comment
Используйте встроенную функцию ISO 8601 в DateUtils: TryISO8601ToDate   -  person LU RD    schedule 17.10.2016


Ответы (3)


Я не знаю, почему так много людей болтают языком, когда они не знают, о чем говорят? Я должен делать эту черную работу; Это инструмент 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

person delphi_hangover    schedule 25.11.2009
comment
1) Вы перезаписываете глобальные переменные формата, что ПЛОХО. Рассмотрите возможность использования потокобезопасных подпрограмм. 2) Вы игнорируете часовой пояс. 3) Хотя trunc() и frac() действительны в настоящее время, в будущем все может измениться. Вместо этого использование DateOf() и TimeOf() делает код более переносимым и понятным. - person Fr0sT; 08.12.2014

Если вы используете Indy 10, его функции StrInternetToDateTime() и GMTToLocalDateTime() (в модуле IdGlobalProtocols) могут анализировать строки в формате ISO-8601.

person Remy Lebeau    schedule 14.10.2016

Это похоже на действие, связанное с интернет-протоколом, поэтому у вас не должно возникнуть проблем с использованием Win32 API для этого. Однако обратите внимание, что Windows не поддерживает корректное преобразование в/из UTC для исторических дат, которым более 20 лет, — Windows просто не имеет для этого достаточно подробностей в настройках часового пояса.

person Lars D    schedule 21.10.2009