2012-08-02 43 views
3

如何將「2012年8月2日18:53」轉換爲DateTime?如何將str轉換爲datetime?

當我使用StrToDate用於將其轉換出現錯誤「無效的日期格式」

+0

+1。事實證明,這是一個比起先看起來更難回答的問題。唯一缺少的是關於您正在從文本文件中讀取值以及該文本文件的編碼是什麼的信息,這將是一個非常好的問題 - 所有其他信息都在那裏。 :-) – 2012-08-02 19:19:51

+0

另請參閱[FormatDateTime的反函數](http://stackoverflow.com/q/2503460/576719)。 – 2012-08-02 19:48:33

+0

[將字符串轉換爲基於任意格式的TDateTime]可能的副本(http://stackoverflow.com/questions/3786823/converting-a-string-to-tdatetime-based-on-an-arbitrary-format) – NGLN 2013-09-17 20:48:24

回答

8

您可以使用VarToDateTime,它支持不同的時間(在Variants單元發現)格式德爾福的RTL沒有。 (它基於COM的日期支持例程,如在各種Microsoft產品中使用的日期支持例程)。我使用您提供的日期進行了測試,它確實將其正確轉換爲TDateTime。在Delphi 2007和XE2上進行測試。在當前documentation

program Project2; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    SysUtils, Variants; 


var 
    DT: TDateTime; 
    TestDate: String; 

begin 
    TestDate := '02 August 2012 18:53'; 

    try 
    DT := VarToDateTime(TestDate); 
    { TODO -oUser -cConsole Main : Insert code here } 
    except 
    on E:Exception do 
     Writeln(E.Classname, ': ', E.Message); 
    end; 
    Writeln(FormatDateTime('mm/dd/yyyy hh:nn', DT)); 
    Readln; 
end. 

更多信息,包括使用的另一個樣本(鏈接在該頁面的底部)。


注意功能Variants單位使用默認的用戶區域設置。如果不是'美國',則上述字符串的轉換可能會失敗。在這種情況下,你最好直接從activex單位指定在美國地區撥打VarDateFromStr

uses 
    sysutils, activex, comobj; 

var 
    TestDate: String; 
    DT: TDateTime; 
begin 
    try 
    TestDate := '02 August 2012 18:53'; 
    OleCheck(VarDateFromStr(WideString(TestDate), $0409, 0, Double(DT))); 
    Writeln(FormatDateTime('mm/dd/yyyy hh:nn', DT)); 
    Readln; 
    except 
    on E:Exception do 
     Writeln(E.Classname, ': ', E.Message); 
    end; 
end. 
+0

但這個函數也有這個錯誤消息的問題:'不能將類型(UnicodeString)的變體轉換爲類型(日期)' – SadeghAlavizadeh 2012-08-02 16:58:38

+0

您的問題沒有提及Unicode,我測試了(正如我剛纔寫的說和提供代碼)在Delphi 2007(AnsiString)和XE2(UnicodeString)版本中。您沒有提供任何信息,這將導致任何人在這裏考慮Unicode問題。 – 2012-08-02 17:04:06

+0

我改變了我的代碼,並把'02八月2012 18:53'放入AnsiString變量,但現在我有這個錯誤:'無法將類型(字符串)的變體轉換爲類型(日期) – SadeghAlavizadeh 2012-08-02 17:10:56