System.DateUtils Simple trimming functions部分
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部分相关推荐
- System.DateUtils 4. IsValidDateTime... 有效时间判断
编译版本:Delphi XE7 function IsValidDate(const AYear, AMonth, ADay: Word): Boolean; function IsValidTime ...
- delphi10.2的Date/time 实用程序单元DateUtils.pas
这些是用于日期和时间计算的函数 {*******************************************************} { Date/time 实用程序单元 } {**** ...
- Reconstruction and Representation of 3D Objects with Radial Basis Functions 阅读笔记
Reconstruction and Representation of 3D Objects with Radial Basis Functions 阅读笔记 紧接着上面的连篇blog,本篇学习如何 ...
- 图解Android - Zygote, System Server 启动分析
Init 是所有Linux程序的起点,而Zygote于Android,正如它的英文意思,是所有java程序的'孵化池'(玩过星际虫族的兄弟都晓得的).用ps 输出可以看到 >adb shell ...
- 用simple mapi 发送一个带附件的邮件
使用 MAPI 实现邮件发送 原 作:deltacat,修改中 最后更新:2004.09.16 版权声明:随意转载,敬请保持文档及说明完整性 关键字: VC 邮件发送 MAPI 一.简述 实际上,本文 ...
- SCU(System Control Units)
SCU(System Control Units) SCU模块组成 The System Control Unit (SCU) is a cluster of sub-modules which co ...
- qemu中的singly-linkedlists, lists, simple queues, and tail queues
qemu中的singly-linkedlists, lists, simple queues, and tail queues qemu/include/qemu/qeueu.h 该文件定义了4种数据 ...
- 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 ...
- 20款效果非常棒的 jQuery 插件分享
这篇文章向大家推荐20款效果非常棒的 jQuery 插件.jQuery 是一个非常优秀的JavaScript库,它简化了 HTML 文档遍历,事件处理,动画以及 Ajax 交互,同时也改变了很多人编写 ...
- 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 ...
最新文章
- python3 collections模块_Python3之内建模块collections
- [LCS]启用WindowsMessenger5.0的调试日志功能来诊断登录LCS服务器
- Linux写时拷贝技术(copy-on-write)
- 缩放手势 ScaleGestureDetector 源码解析,这一篇就够了
- 构建忽略测试_分类测试以减少构建时间
- 最受欢迎的应用服务器
- pandas filter_数据分析之Pandas操作(2)
- 5-Dockerfile文件
- 杭电4530小Q系列故事——大笨钟
- weak_ptr概述,weak_ptr常用操作、尺寸
- linux hasp的加密狗驱动程序,hasp加密狗驱动下载-hasp加密狗驱动(圣天诺加密狗驱动) win7/8/10 官方通用版 - 河东下载站...
- 学习韩顺平java基础笔记 (自用)
- IP地址资源的分配和管理
- 如何获取微信应用appid
- python3 print和format函数
- lombok导入报错,版本1.18.12已在maven本地仓库中
- 计算机应用二级客观题,计算机二级客观题
- 【修真院“善良”系列之十七】请拿好这支时间之箭
- 宏文件下载_EPLAN~宏资源获取
- 【渝粤教育】国家开放大学2018年春季 0049-22T法律文书 参考试题
热门文章
- 20220326-代码日记-Unity画符
- Win8.1在关机界面卡住无反应问题的解决
- 学习计算机基本知识,怎样按序学习计算机基本知识
- TFP与TFTP的联系与区别
- 居然打不开msi文件?
- Could not find acceptable representation 原因探究
- Vulkan层的简要说明
- linux scp密码参数,linux-scp不输入密码 - 不断的前进ING。。。 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- 教你如何拍好人像摄影
- mongo上云迁移同步mongoshake