System.DateUtils Simple trimming functions部分

從今天起,開始研究學習一下Delphi源碼,以更深刻的瞭解這門語言,再也不僅僅作一個代碼搬運工,誓作一名高級代碼搬運工!!!html

準備先從DateUtils提及,有時間就更新一下,由於是新手,因此若是有說的不對或不許確的地方還望各位大牛給予指點,謝謝!!!api

(由於我我的用過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.


接下來對以上代碼用到的關鍵字及其餘函數做一個簡單介紹:spa

inline:(1)用於描述某個函數時-爲了提升應用程序的性能,能夠用inline聲明一個函數過過程,對於聲明爲inline的過程,編譯器在編譯時,會取代正常的過程調用方式,取而代之是 直接把這個函數的編譯代碼拿過來生成到調用該過程的地方,有多處調用一個函數,都直接在調用處插入函數的編譯代碼,這樣的弊端,會生成較大的EXE文件。.net

摘自:Delphi XE4 inline的用法code

(2)InLine關鍵字用於Asm或assembler結構中,用於指出該彙編語句是向下兼容的.它對於程序的編譯沒有任何影響.orm

摘自:Delphi經常使用關鍵字用法詳解

關於Delphi 的Inline關鍵字的說明文章相對較少,暫時只找到了以上兩條重要的貼在這裏,之後有時間了能夠詳細瞭解一下,或者有人知道更詳細的資料能夠直接回複本帖,也能夠私信我.

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

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


代碼示例

相關文章
相關標籤/搜索