2009-10-20 50 views
4
var 
    tm : string; 
    dt : tdatetime; 

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

我知道我可以手動解析它,但我不知道是否有任何內置函數或Win32 API函數來執行此操作?在Delphi中將UTC字符串轉換爲TDatetime

+0

寫完我自己的班級來處理這個問題,並完全遵守標準,這是相當複雜的。會對這個問題的任何更快的解決方案感興趣。 – Gerard 2009-10-20 23:16:04

+3

'標準'是ISO 8601 – Gerard 2009-10-20 23:18:53

+0

相關問題:http://stackoverflow.com/questions/1438870/in-delphi-is-there-a-function-to-convert-xml-date-and-time-to- tdatetime – mghie 2009-10-21 04:36:03

回答

0

這看起來像一個互聯網協議相關的活動,所以你應該沒有問題在使用Win32 API。但是,請注意,對於歷史日期超過約20年的Windows,Windows不能正確支持轉換爲UTC的轉換 - Windows在其時區設置中沒有足夠的詳細信息。

3

我不知道爲什麼有這麼多人在他們不知道自己在說什麼的時候開口說話?我必須做這個卑鄙的工作;它是一個RAD工具嗎?儘管如此,我有時會發現德爾福有一個非常棒的體系結構。

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

+0

1)您覆蓋全局格式變量,這是不好的事情。考慮使用線程安全例程。 2)你忽略時區。 3)雖然trunc()和frac()是有效的,但是將來可能會改變。使用DateOf()和TimeOf()可以使代碼更加便攜和清晰。 – Fr0sT 2014-12-08 08:07:03

0

如果使用印地10,其StrInternetToDateTime()GMTToLocalDateTime()函數(在IdGlobalProtocols單元)可以解析ISO-8601格式的字符串。

相關問題