如何将字符串转换为日期时间?

3

如何将“2012年8月2日18:53”转换为DateTime?

使用StrToDate进行转换时,出现“无效的日期格式”错误。


+1. 这个问题的答案比起一开始看起来要困难得多。唯一缺少的是关于你从文本文件中读取值以及该文本文件的编码信息,如果有这些信息,那么这将是一个非常好的问题 - 所有其他信息都已经提供了。 :-) - Ken White
请参阅FormatDateTime的反函数 - LU RD
可能是将字符串转换为基于任意格式的TDateTime的重复问题。 - NGLN
1个回答

9
您可以使用Variants单元中的VarToDateTime,它支持Delphi RTL不支持的各种时间格式。(它基于COM的日期支持例程,例如在各种Microsoft产品中使用的那些例程。)我测试了您提供的日期,它确实正确地将其转换为TDateTime。在Delphi 2007和XE2上进行了测试。
program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils, Variants;


var
  DT: TDateTime;
  TestDate: String;

begin
  TestDate := '02 August 2012 18:53';

  try
    DT := VarToDateTime(TestDate);
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
  Writeln(FormatDateTime('mm/dd/yyyy hh:nn', DT));
  Readln;
end.

更多信息请参见文档,包括另一个使用示例(该页面底部的链接)。


请注意,Variants单元中的函数使用默认用户区域设置。如果不是“美国”,则上述字符串的转换可能会失败。在这种情况下,您最好直接从activex单元调用VarDateFromStr并指定美国区域设置:

uses
  sysutils, activex, comobj;

var
  TestDate: String;
  DT: TDateTime;
begin
  try
    TestDate := '02 August 2012 18:53';
    OleCheck(VarDateFromStr(WideString(TestDate), $0409, 0, Double(DT)));
    Writeln(FormatDateTime('mm/dd/yyyy hh:nn', DT));
    Readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.

但是这个函数也有问题,出现了这个错误信息:'无法将类型为(UnicodeString)的变量转换为类型(Date)'。 - SadeghAlavizadeh
你的问题没有提到Unicode,而我已经测试过(正如我刚刚写下并提供代码所示)在Delphi 2007(AnsiString)和XE2(UnicodeString)版本中。你没有提供任何信息让任何人考虑Unicode问题。 - Ken White
是的,我知道,但我需要将那个字符串从文本文件转换为TDateTime,并且我从来没有说过你的代码有问题。我只是在寻找解决我的问题的方法。谢谢 - SadeghAlavizadeh
同样的错误在这里(“无法转换类型为..的变量”)。可能是因为'VarDateFromStr'最终使用'LOCALE_USER_DEFAULT'调用了?不知道。。 - Sertac Akyuz
2
@Ken - 这正是问题所在,VarToDateTime 导致调用 LOCALE_USER_DEFAULT 的 'VarDateFromStr' 函数。如果用户区域设置不是美国(或兼容的),就会发生类型不匹配的错误。您介意我稍微编辑一下你的答案吗? - Sertac Akyuz
显示剩余5条评论

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