2019独角兽企业重金招聘Python工程师标准>>>

从今天起,开始研究学习一下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;
beginResult := Trunc(AValue);
end;function TimeOf(const AValue: TDateTime): TDateTime;
beginResult := Frac(AValue);
end;

下面是我测试的代码

unit UMain;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, system.DateUtils;typeTFMain = class(TForm)btnDateOf: TButton;MMOResult: TMemo;btnTimeOf: TButton;procedure FormCreate(Sender: TObject);procedure btnDateOfClick(Sender: TObject);procedure btnTimeOfClick(Sender: TObject);privateFDateFormatSetting: TFormatSettings;{ Private declarations }public{ Public declarations }end;varFMain: TFMain;sDate: string = '2015-08-10 14:28:28';implementation{$R *.dfm}procedure TFMain.btnDateOfClick(Sender: TObject);
vardBefore, 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:28MMOResult.Lines.Add('(DateOf)beforeDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dBefore));//(DateOf)afterDate:2015-08-10 00:00:00MMOResult.Lines.Add('(DateOf)afterDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dAfter));
end;procedure TFMain.btnTimeOfClick(Sender: TObject);
vardBefore, 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:28MMOResult.Lines.Add('(TimeOf)beforeDate:' + FormatDateTime('yyyy-MM-dd HH:nn:ss', dBefore));//(TimeOf)afterDate:1899-12-30 14:28:28MMOResult.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.

代码示例

转载于:https://my.oschina.net/u/140474/blog/490228

System.DateUtils Simple trimming functions部分相关推荐

  1. System.DateUtils 4. IsValidDateTime... 有效时间判断

    编译版本:Delphi XE7 function IsValidDate(const AYear, AMonth, ADay: Word): Boolean; function IsValidTime ...

  2. delphi10.2的Date/time 实用程序单元DateUtils.pas

    这些是用于日期和时间计算的函数 {*******************************************************} { Date/time 实用程序单元 } {**** ...

  3. Reconstruction and Representation of 3D Objects with Radial Basis Functions 阅读笔记

    Reconstruction and Representation of 3D Objects with Radial Basis Functions 阅读笔记 紧接着上面的连篇blog,本篇学习如何 ...

  4. 图解Android - Zygote, System Server 启动分析

    Init 是所有Linux程序的起点,而Zygote于Android,正如它的英文意思,是所有java程序的'孵化池'(玩过星际虫族的兄弟都晓得的).用ps 输出可以看到 >adb shell ...

  5. 用simple mapi 发送一个带附件的邮件

    使用 MAPI 实现邮件发送 原 作:deltacat,修改中 最后更新:2004.09.16 版权声明:随意转载,敬请保持文档及说明完整性 关键字: VC 邮件发送 MAPI 一.简述 实际上,本文 ...

  6. SCU(System Control Units)

    SCU(System Control Units) SCU模块组成 The System Control Unit (SCU) is a cluster of sub-modules which co ...

  7. qemu中的singly-linkedlists, lists, simple queues, and tail queues

    qemu中的singly-linkedlists, lists, simple queues, and tail queues qemu/include/qemu/qeueu.h 该文件定义了4种数据 ...

  8. arduino 呼吸灯_如何改善您的Arduino呼吸机:用于临时COVID-19呼吸机设计的RTS和SCS简介...

    arduino 呼吸灯 The world as we know it was recently taken by storm. That storm was the outbreak of the ...

  9. 20款效果非常棒的 jQuery 插件分享

    这篇文章向大家推荐20款效果非常棒的 jQuery 插件.jQuery 是一个非常优秀的JavaScript库,它简化了 HTML 文档遍历,事件处理,动画以及 Ajax 交互,同时也改变了很多人编写 ...

  10. java openssl库,Java的OpenSSL

    I have to use OpenSSL in a Java web project and I don't know anything about 'OpenSSL'. How can I int ...

最新文章

  1. python3 collections模块_Python3之内建模块collections
  2. [LCS]启用WindowsMessenger5.0的调试日志功能来诊断登录LCS服务器
  3. Linux写时拷贝技术(copy-on-write)
  4. 缩放手势 ScaleGestureDetector 源码解析,这一篇就够了
  5. 构建忽略测试_分类测试以减少构建时间
  6. 最受欢迎的应用服务器
  7. pandas filter_数据分析之Pandas操作(2)
  8. 5-Dockerfile文件
  9. 杭电4530小Q系列故事——大笨钟
  10. weak_ptr概述,weak_ptr常用操作、尺寸
  11. linux hasp的加密狗驱动程序,hasp加密狗驱动下载-hasp加密狗驱动(圣天诺加密狗驱动) win7/8/10 官方通用版 - 河东下载站...
  12. 学习韩顺平java基础笔记 (自用)
  13. IP地址资源的分配和管理
  14. 如何获取微信应用appid
  15. python3 print和format函数
  16. lombok导入报错,版本1.18.12已在maven本地仓库中
  17. 计算机应用二级客观题,计算机二级客观题
  18. 【修真院“善良”系列之十七】请拿好这支时间之箭
  19. 宏文件下载_EPLAN~宏资源获取
  20. 【渝粤教育】国家开放大学2018年春季 0049-22T法律文书 参考试题

热门文章

  1. 20220326-代码日记-Unity画符
  2. Win8.1在关机界面卡住无反应问题的解决
  3. 学习计算机基本知识,怎样按序学习计算机基本知识
  4. TFP与TFTP的联系与区别
  5. 居然打不开msi文件?
  6. Could not find acceptable representation 原因探究
  7. Vulkan层的简要说明
  8. linux scp密码参数,linux-scp不输入密码 - 不断的前进ING。。。 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  9. 教你如何拍好人像摄影
  10. mongo上云迁移同步mongoshake