2012-11-09 4 views
14

動作しません。このコードは、Delphi XE2で動作するはずですが、それはStrtoDateTime変換では「ない有効な日付と時刻」エラーを与える:変換が

procedure TForm2.Button1Click(Sender: TObject); 
var 
    s: string; 
    d: TDateTime; 
    FmtStngs: TFormatSettings; 
begin 
    GetLocaleFormatSettings(GetThreadLocale, FmtStngs); 
    FmtStngs.DateSeparator := #32; 
    FmtStngs.ShortDateFormat := 'dd mmm yyyy'; 
    FmtStngs.TimeSeparator := ':'; 
    FmtStngs.LongTimeFormat := 'hh:nn'; 

    s := FormatDateTime('', Now, FmtStngs); 
    d := StrToDateTime(s, FmtStngs); 
end; 

任意のヒントを?

+2

ところで:DateSeparatorだけ書式、文字列に「/」を変更するために使用されます。使用するには、ShortDateFormatを 'dd/mmm/yyyy'に設定する必要があります。それ以外の場合は役に立たない:o) –

答えて

15

で報告されましたStrToDateTime。両方の実装を見てみると、StrToDateTimeはどういうわけか...そして、VarToDateTimeはそれ自身では判断できないかどうかをOSに尋ねます。

これは、Delphi XE3で動作します(だけでなく、以前のバージョンで動作します):

procedure TForm2.Button1Click(Sender: TObject); 
var 
    s: string; 
    d: TDateTime; 
    FmtStngs: TFormatSettings; 
begin 
    GetLocaleFormatSettings(GetThreadLocale, FmtStngs); 
    FmtStngs.DateSeparator := #32; 
    FmtStngs.ShortDateFormat := 'dd mmm yyyy'; 
    FmtStngs.TimeSeparator := ':'; 
    FmtStngs.LongTimeFormat := 'hh:nn'; 

    s := FormatDateTime('', Now, FmtStngs); 
    d := VarToDateTime(s); 
end; 
+1

Inbファクト、VarToDateTimeを使用する。さらに、TFormatSettings構造体を使用する必要がなくなります。 Thnx for all .. – Moore

15

あなたは内部ルーチンが文字列は、文字列の日付と時刻の部分を決定するために、この文字を使用して解析するので、あなたは、DateSeparatorとして空白を使用することはできません二つの問題

  1. を持っています。数ヶ月部分がmmm文字列を使用する場合

  2. StrToDateTime機能が動作しない、これはあなたには、いくつかの特別な日時・フォーマットを変換したい場合は、より良いVarToDateTimeの代わりを使用する必要があります。このQC 23301