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.8792017-3-5T6:12:34.879
自动识别 => 2017-03-05 06:12:34.87920170305061234879
自动识别 => 2017-03-05 06:12:34.87920170305
自动识别 => 2017-03-05 00:00:00.000061234879
自动识别 => 1899-12-30 06:12:34.87920170305061234
自动识别 => 2017-03-05 06:12:34.0002017-3-5 6:12:34.879
自动识别 => 2017-03-05 06:12:34.87917-3-5 6:12:34.879
自动识别 => 2017-03-05 06:12:34.87917-3-5
自动识别 => 2017-03-05 00:00:00.00031/5/2018
自动识别 => 2018-05-31 00:00:00.0005/31/2018
自动识别 => 2018-05-31 00:00:00.0002018/01/02 11:22:25.111
自动识别 => 2018-01-02 11:22:25.1112018年1月2日 11点22分25秒
y年m月d日 h点n分s秒 => 2018-01-02 11:22:25.000Fri, 13 Apr 2018 14:29:59 GMT
自动识别 => 2018-04-13 14:29:59.00013-Apr-2018 14:29:59 GMT+08:00
自动识别 => 2018-03-11 06:29:59.000
下面的自动识别可能不正确,需要手动指定格式
12/10/1998
自动识别 => 1998-10-12 00:00:00.00012/10/1998
m/d/y => 1998-12-10 00:00:00.00012/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群反馈。