如何在delphi中将字符串转换为日期

时间:2018-07-13 05:02:53

标签: datetime delphi

当我将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

3 个答案:

答案 0 :(得分:11)

使用stringTDateTimeVarToDateTime的转换成功取决于用户系统中的语言环境设置。如果这些设置与字符串不匹配,转换将失败。这就是转换在我的系统上以及在您的系统上都失败的原因。


主要选项(如果使用的是Delphi XE6或更高版本)是使用 Marc Guillot in another answer 建议的功能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;

答案 1 :(得分:5)

这些似乎是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

答案 2 :(得分:-3)

尝试使用函数StrToDateTime,该函数将string DateTime转换为TDateTime值。 请注意,传递的日期时间格式应为当前系统日期/时间格式,否则它将引发异常。 例如:StrToDateTime('2018-07-11 12:34:56');