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;
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;
これらは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