17

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

ヒントはありますか?

4

2 に答える 2

19

特別な DateTime 形式を変換する場合は、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;
于 2012-11-09T19:09:53.543 に答える
17

あなたには2つの問題があります

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

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

于 2012-11-09T15:15:26.437 に答える