System.DateUtils Simple trimming functions部分

从今天起,开始研究学习一下Delphi源码,以更深入的了解这门语言,不再仅仅做一个代码搬运工,誓做一名高级代码搬运工!!!

准备先从DateUtils说起,有时间就更新一下,因为是新手,所以如果有说的不对或不准确的地方还望各位大牛给予指点,谢谢!!!

(因为我个人用过D6,D7,2006,XE8,最常用的为D7,现在最新版Delphi 为XE8,所以以后所有相关的文章都是以XE8的源码来研究,特殊说明除外)

System.DateUtils这个单元里面包含系统预定义的一些常用的日期\时间相关函数,源文件在D:\ProgramFiles\Embarcadero\Studio\16.0\source\rtl\common\System.DateUtils.pas(安装路径肯定要换成你们自己的)

先看看DateOf与TimeOf的声明与实现

//声明部分,在System.DateUtils的第69行
{ Simple trimming functions }

function DateOf(const AValue: TDateTime): TDateTime; inline;
function TimeOf(const AValue: TDateTime): TDateTime; inline;
//实现部分,在System.DateUtils的第577行
function DateOf(const AValue: TDateTime): TDateTime;
begin
  Result := Trunc(AValue);
end;

function TimeOf(const AValue: TDateTime): TDateTime;
begin
  Result := Frac(AValue);
end;

下面是我测试的代码

unit UMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, system.DateUtils;

type
  TFMain = class(TForm)
    btnDateOf: TButton;
    MMOResult: TMemo;
    btnTimeOf: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnDateOfClick(Sender: TObject);
    procedure btnTimeOfClick(Sender: TObject);
  private
    FDateFormatSetting: TFormatSettings;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FMain: TFMain;
  sDate: string = '2015-08-10 14:28:28';

implementation

{$R *.dfm}

procedure TFMain.btnDateOfClick(Sender: TObject);
var
  dBefore, dAfter: TDateTime;
begin
  //DateOf:获取参数的日期部分,时间部分用00:00:00填充(此处不考虑毫秒)
  dBefore := StrToDateTime(sDate, FDateFormatSetting);
  //因为我们知道TDateTime类型实际上是一个从1899年12月30日开始从0算起的浮点数
  //而DateOf里面直接使用Trunc对传入的日期做了整数截断操作
  //所以得到的值就是一个从1899年12月30日开始+返回的整数天的一个新的日期
  //不包含时分秒(因为TDateTime整数部分代表日期,小数部分代表时间)
  dAfter := DateOf(dBefore);
  //(DateOf)beforeDate:2015-08-10 14:28:28
  MMOResult.Lines.Add('(DateOf)beforeDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dBefore));
  //(DateOf)afterDate:2015-08-10 00:00:00
  MMOResult.Lines.Add('(DateOf)afterDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dAfter));
end;

procedure TFMain.btnTimeOfClick(Sender: TObject);
var
  dBefore, dAfter: TDateTime;
begin
  //TimeOf:获取参数的时间部分,日期部分用1899-12-30填充
  dBefore := StrToDateTime(sDate, FDateFormatSetting);
  //同样的道理,TimeOf里面使用Frac函数直接取参数的小数部分
  //这时候得到的浮点数其实是一天的百分比
  //直接用24*60*TimeOf返回值,得到的就是从0点0分0秒0毫秒到这个时间的分钟数
  dAfter := TimeOf(dBefore);
  //而Delphi的日期是从1899-12-30开始的
  //所以计算出来的结果为
  //(TimeOf)beforeDate:2015-08-10 14:28:28
  MMOResult.Lines.Add('(TimeOf)beforeDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dBefore));
  //(TimeOf)afterDate:1899-12-30 14:28:28
  MMOResult.Lines.Add('(TimeOf)afterDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dAfter));
end;

procedure TFMain.FormCreate(Sender: TObject);
begin
  //初始化公用的日期格式化参数 此处是为了兼容不同电脑的日期格式
  FDateFormatSetting.ShortDateFormat := 'yyyy-MM-dd';
  FDateFormatSetting.DateSeparator := '-';
  FDateFormatSetting.TimeSeparator := ':';
  //FDateFormatSetting.LongTimeFormat:='hh:mm:ss.zzz';
  FDateFormatSetting.LongTimeFormat := 'hh:mm:ss';
end;

end.


接下来对以上代码用到的关键字及其他函数作一个简单介绍:

inline:(1)用于描述某个函数时-为了提高应用程序的性能,可以用inline声明一个函数过过程,对于声明为inline的过程,编译器在编译时,会取代正常的过程调用方式,取而代之是 直接把这个函数的编译代码拿过来生成到调用该过程的地方,有多处调用一个函数,都直接在调用处插入函数的编译代码,这样的弊端,会生成较大的EXE文件。

摘自:Delphi XE4 inline的用法

(2)InLine关键字用于Asm或assembler结构中,用于指出该汇编语句是向下兼容的.它对于程序的编译没有任何影响.

摘自:Delphi常用关键字用法详解

关于Delphi 的Inline关键字的说明文章相对较少,暂时只找到了以上两条重要的贴在这里,以后有时间了可以详细了解一下,或者有人知道更详细的资料可以直接回复本帖,也可以私信我.

Trunc():返回参数的整数部分,如Trunc(-123.55)=-123.

Frac():返回参数的小数部分,如Frac(-123.55)=-0.55.


代码示例

你可能感兴趣的:(System.DateUtils Simple trimming functions部分)