web-dev-qa-db-ja.com

デルファイで文字列を日付に変換する方法

stringタイプをTDateTimeに変換すると、エラーが発生します。 VarToDateTime 関数を使用しています。文字列としての日付は2018-07-11T13:45:14.363

var
  s: string;
  v: Variant;
  dt: TDateTime;
begin
  s := '2018-07-11T13:45:14.363';
  v := s;
  dt := VarToDateTime(v);
end;

enter image description here

7

stringを使用してTDateTimeからVarToDateTimeへの変換が成功するかどうかは、ユーザーシステムのロケール設定によって異なります。これらの設定が文字列と一致しない場合、変換は失敗します。これが、あなたのシステムでも、私のシステムでも変換が失敗する理由です。


プライマリオプションは、Delphi XE6以降を使用している場合、Marc Guillotが示唆するように関数ISO8601ToDate()を使用することです- 別の答え

Delphi 2010以降を使用している場合は、ここに提示されているソリューションを使用できます。

Delphi 2010より前のバージョンでは、入力文字列の「T」がチョークされ、「T」が削除されるかスペースで置き換えられると成功する場合があります。


変換する文字列に応じて調整できるTFormatSettingを受け入れる変換関数を使用します。このような関数は、次のStrToDateTime()のオーバーロードです( Embarcadero document を参照)

function StrToDateTime(const S: string; const AFormatSettings: TFormatSettings): TDateTime;

変換する文字列に一致するようにAFormatSettingsを設定すると、変換が成功することが保証されます。

procedure TForm3.Button1Click(Sender: TObject);
var
  fs: TFormatSettings;
  s: string;
  dt: TDateTime;
begin
  fs := TFormatSettings.Create;
  fs.DateSeparator := '-';
  fs.ShortDateFormat := 'yyyy-MM-dd';
  fs.TimeSeparator := ':';
  fs.ShortTimeFormat := 'hh:mm';
  fs.LongTimeFormat := 'hh:mm:ss';

  s := '2018-07-11T13:45:14.363';
  dt := StrToDateTime(s, fs);
end;
12
Tom Brunberg

これらはISO8601日時文字列のようです: https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations

そのため、Delphi XE 6以降では、対応する変換関数ISO8601ToDateを使用できます

http://docwiki.embarcadero.com/Libraries/XE8/en/System.DateUtils.ISO8601ToDate

ただし、Delphiの古いバージョンを使用している場合は、XSBuiltInsユニットのXMLTimeToDateTime関数を使用して、その変換を実行できます(Delphi 6以降で使用可能)。

http://docwiki.embarcadero.com/Libraries/Tokyo/en/Soap.XSBuiltIns.XMLTimeToDateTime

5
Marc Guillot