web-dev-qa-db-ja.com

StrToDateTimeとTFormatSettingsを使用した変換が機能しない

このコードは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;

ヒントはありますか?

16
Moore

特別なDateTime-Formatsを変換したい場合は、StrToDateTimeの代わりに VarToDateTime を使用することをお勧めします。両方の実装を見てみると、StrToDateTimeがなんとなく...であり、VarToDateTimeがOSだけで判断できないかどうかを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;
18
Sir Rufo

2つの問題があります

  1. 文字列を解析する内部ルーチンはこの文字を使用して文字列の日付と時刻の部分を決定するため、WhiteSpaceをDateSeparatorとして使用することはできません。

  2. StrToDateTime 関数は、月の部分でmmm文字列を使用すると機能しません。これは、これで報告されます QC 23301

17
RRUZ