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

13

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

进入图片描述


7
由于你没有提供代码,回答这个问题会很困难。如果你阅读了https://dev59.com/H2865IYBdhLWcg3wfusk#3789628可能会有所帮助。如果还不行,请编辑你的帖子并提供一个最小可复现示例([mcve])来展示你遇到的具体问题。 - Ken White
3个回答

24
使用VarToDateTimestring转换为TDateTime的成功取决于用户系统中的区域设置。如果这些设置与字符串不匹配,则转换失败。这就是为什么该转换在我的系统上以及您的系统上都失败的原因。

首选,如果您使用Delphi XE6或更高版本,则可以使用函数ISO8601ToDate(),如Marc Guillot在另一个答案中所建议的

如果您使用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转换方法不是更好吗? - David Heffernan

7
这些似乎是ISO8601日期时间字符串:https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations 因此,在Delphi XE6及更高版本中,您可以使用相应的转换函数: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


1
好的发现 +1,您可能想添加一个小细节:*...函数在Delphi XE6及更高版本中可用:ISO...* 该功能已在XE6中添加,并在XE8文档中得到了适当的记录。 - Tom Brunberg
1
但是Marc,它只能在Delphi XE6中使用。 - Tom Brunberg
@TomBrunberg 是的,不幸的是,OP没有说他在使用哪个Delphi版本。但你是对的,在之前的版本中,他需要找到另一个解决方案,比如你的定制转换器。 - Marc Guillot
1
@TomBrunberg 如果是这种情况,他可以使用自从Delphi 6版本起就存在于XSBuiltIns中的XMLTimeToDateTime函数。请参考http://docwiki.embarcadero.com/Libraries/Tokyo/en/Soap.XSBuiltIns.XMLTimeToDateTime - Marc Guillot

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

3
StrToDateTime('2018-07-11 12:34:56') 引发了一个异常。此外,问题中的字符串格式不同。-1 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接