[教程]DateTimeFromString 函数的使用说明

DateTimeFromString 用于将一个日期时间格式的字符串表达式转换为日期时间类型,用于替代 Delphi 自己的 StrToDate 函数(弱弱的一个函数,我一直忽略它的存在)。

在绝大部分场景下,DateTimeFromString 可以正确识别多咱格式的日期时间字符串,但并不代表它的自动识别智能到可以理解一切,对于 m/d/y 或 d/m/y 这种格式,当 m 和 d 的值在12及以下时,它无法识别应该匹配那种格式,所以默认匹配的是  d/m/y,如果不正确,就需要你人工指定格式参数。

DateTimeFromString 使用的日期时间类型格式化字符串同 FormatDateTime 函数,相关说明请参考 FormatDateTime 的说明。

如果不传格式字符串,则为自动识别模式,支持识别以下格式:

  • 纯数字:yymmdd yymmddhhnnss yymmddhhnnsszzz yyyymmdd yyyymmddhhnnss yyyymmddhhnnsszzz hhnnss hhnnsszzz
  • 其它格式:y-m-d h:n:s.z、y-m-d h:n:s、y-m-d、h:n:s.z、h:n:s、y-m-d”T”h:n:s.z、y-m-d”T”h:n:s、d/m/y h:n:s.z、d/m/y h:n:s、d/m/y、m/d/y h:n:s.z、m/d/y h:n:s、m/d/y、y/m/d h:n:s.z、y/m/d h:n:s、y/m/d 等等几乎各种常见的已知格式
  • Unix/Web 时间戳格式,如:13-Apr-2018 14:29:59 GMT+08:00,注意这种带时区的格式会一律转换为对应的 UTC 时间,所以要转换为本地时间,请自行加上时区

下面是实际的用例测试结果:

2017-3-5T6:12:34.879
yyyy-m-d”T”h:n:s.z => 2017-03-05 06:12:34.879

2017-3-5T6:12:34.879
自动识别 => 2017-03-05 06:12:34.879

20170305061234879
自动识别 => 2017-03-05 06:12:34.879

20170305
自动识别 => 2017-03-05 00:00:00.000

061234879
自动识别 => 1899-12-30 06:12:34.879

20170305061234
自动识别 => 2017-03-05 06:12:34.000

2017-3-5 6:12:34.879
自动识别 => 2017-03-05 06:12:34.879

17-3-5 6:12:34.879
自动识别 => 2017-03-05 06:12:34.879

17-3-5
自动识别 => 2017-03-05 00:00:00.000

31/5/2018
自动识别 => 2018-05-31 00:00:00.000

5/31/2018
自动识别 => 2018-05-31 00:00:00.000

2018/01/02 11:22:25.111
自动识别 => 2018-01-02 11:22:25.111

2018年1月2日 11点22分25秒
y年m月d日 h点n分s秒 => 2018-01-02 11:22:25.000

Fri, 13 Apr 2018 14:29:59 GMT
自动识别 => 2018-04-13 14:29:59.000

13-Apr-2018 14:29:59 GMT+08:00
自动识别 => 2018-03-11 06:29:59.000

下面的自动识别可能不正确,需要手动指定格式

12/10/1998
自动识别 => 1998-10-12 00:00:00.000

12/10/1998
m/d/y => 1998-12-10 00:00:00.000

12/10/1998
d/m/y => 1998-10-12 00:00:00.000

这个函数有两个重载,参数不用说明一看就知道怎么用。如果你不知道,那我也不知道,函数声明如下:

function DateTimeFromString(AStr: String; var AResult: TDateTime;
  AFormat: String): Boolean; overload;
function DateTimeFromString(Str: String; AFormat: String; ADef: TDateTime = 0)
  : TDateTime; overload;

好吧,这两个重载看起来几乎一样,调用的例子:

if DateTimeFromString('2017-3-5T6:12:34.879',ATime,'') then
  ...

ATime:=DateTimeFromString('2017-3-5T6:12:34.879','',Now);

如果你在实际使用中遇到问题,欢迎到官方QQ群反馈。

分享到: