Конвертировать строку UTC в TDatetime в Delphi
var
tm : string;
dt : tdatetime;
tm := '2009-08-21T09:11:21Z';
dt := ?
Я знаю, что могу разобрать его вручную, но мне интересно, есть ли встроенная функция или функция Win32 API для этого?
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
Если вы используете Indy 10, его StrInternetToDateTime()
а также GMTToLocalDateTime()
функции (в IdGlobalProtocols
) может анализировать строки в формате ISO-8601.
Это похоже на действия, связанные с интернет-протоколом, поэтому у вас не должно возникнуть проблем с использованием Win32 API для этого. Однако обратите внимание, что Windows неправильно поддерживает преобразование в / из UTC для исторических дат, которым более приблизительно 20 лет - Windows просто не имеет достаточно деталей в настройках своего часового пояса для этого.