Delphi中对时间操作方法汇总

一般来说在delphi中用于描述时间的有几种数据结构,而对时间的操作,实质上就是对这些结构的操作。

TDateTime类型:

Delphi中最常用的表示日期时间的数据类型TDateTime类型,和普通的整形数一样,你可以给日期定义一个日期型变量以便在程序中进行操作。TdateTime类型实质上是一个Double型的数,在Delphi中是这样定义TdateTime类型: type TDateTime = type Double,具体的算法是用Double数的整数部分表示日期,以1989年12月30日为基准点,以天为单位进行加减,如数字1表示1900年1月1日,数字-1表示1989年12月29日。而小数部分则用来表示时间,其值为欲表示的时间与一整天总时间的比值,如早上6点就是6/24=0.25,而早上6:15就是(6*60+15)/(24*60)=0.2604166666666666666666666666667,下面,给出几个例子说明TDateTime类型 与Double类型的交互关系
0 12/30/1899 00:00:00
2.75 1/1/1900 18:00:00
-1.25 12/29/1899 6:00:00
35065 1/1/1996 00:00:00
相信大家一定能自己理解TdateTime与Double之间的转换方法,因此,从根本上对TDateTime的操作与Double完全一样。

TTimeStamp 类型:
这是一个用来描述日期与时间的一个结构类型,在Delphi中是这样定义的:

type 
TTimeStamp = record 
Time: Integer; {从午夜0点开始到指定时间的毫秒数 } 
Date: Integer; {以本日为基准到指点日期的天数} 
end; 

和TDateTime相比,可更直观表示高精度的时间,一般用于毫秒级的运算以及用于表示较长的时间。

PsystemTime 类型:
一个用于WinApi中对时间操作的指针型结构。他的定义为:

type 
PSystemTime = ^TSystemTime; 
TSystemTime = record 
wYear: Word; 
wMonth: Word; 
wDayOfWeek: Word; 
wDay: Word; 
wHour: Word; 
wMinute: Word; 
wSecond: Word; 
wMilliseconds: Word; 
end; 

这个结构多用于调用WinApi操作时使用。
在了解了各种时间类型的本质后,相信大家都有一套操作这些类型的时间的想法,不过在Delphi中还提供了一整套用于操作时间的过程函数,这些过程和函数都定义在SysUnit这个单元中,现在就向大家介绍Delphi中相关函数:

用于时间操作的函数

Date函数:
定义:Date: TDateTime;
作用:返回当前的日期
范例:

CurrentDate := Date; 

DayOfWeek函数:
定义:function DayOfWeek(Date: TDateTime): Integer;
作用:得到指定日期的星期值,返回1~7,代表周日到周六。

IncMouth函数:
定义:function IncMonth(const Date: TDateTime; NumberOfMonths: Integer): TDateTime;
作用:求给定的日期Data在NumberOfMonths个月后的日期。
范例:

Date1 := IncMonth(date,10); 

如果今天是2002-5-3,则Date1就是2003-3-3

IsLeapYear函数:
定义:function IsLeapYear(Year: Word): Boolean;
作用:判断指定的年份是否是闰年;
范例:

if isLeapYear(2000) then ShowMessage(‘该年是闰年'); 

Now函数:
定义:function Now: TDateTime;
作用:用于取得当前的日期时间
范例:

CurrentDateTime := Now; 

ReplaceDate 过程
定义:procedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime);
作用:使用参数Newdate日期部分替换参数DateTime的日期部分,但不改变时间部分。

ReplaceDate 过程
定义:procedure ReplaceTime(var DateTime: TDateTime; const NewTime: TDateTime);
作用:使用参数Newdate时间部分替换参数DateTime的时间部分,但不改变日期部分。
如果上述这两个过程一起用,就相当于赋值了。

Time函数:
定义:function Time: TDateTime;
作用:返回当前的时间
范例:

CurrentTime := Time; 

各种时间类型之间的转换函数

DateTimeToFileDate函数:
定义:DateTimeToFileDate(DateTime: TDateTime): Integer;
作用:将一个TDateTime类型的时间转化为Dos环境中的时间,Dos环境下对时间的访问方法和VCL中的TdateTime类型不一样,在进行文件操作时,为了保持时间的一致性,需要使用DateTimeToFileDate函数进行转化, 返回的Integer的值就是Dos下的用于描述时间的值。

DateTimeToSystemTime 过程:
定义:procedure DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TSystemTime);
作用:将一个TDateTime类型的时间转换为Win API函数所使用的TSystemTime类型,在使用WinApi函数操纵时间时用到。

SystemTimeToDateTime 函数:
定义:function SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime;
作用:将一个在WinApi函数中得到的TSysTemTime类型的数转换为TDateTime类型。

DateTimeToTimeStamp 函数:
TimeStampToDateTime 函数:
定义:DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
作用:用于在TDataTime类型与TTimeStamp之间进行互相转换。TDataTime 用一个double描绘一个时间,而TTimeStamp则是采用两个整形数分别描述时间。两种类型的区别可参考文章开始处的数据类型描述部分。

EncodeDate 函数:
定义:function EncodeDate(Year,Month,Day: Word): TDateTime;
作用: 输入年(year),月(month),日(day)的值,将该日期返回为TDateTime类型,年的范围为1-9999,月份的范围为1-12,日期的范围视当月的情况而定,如果输入的值超出范围,则将产生一个EConvertError错误。

DecodeDate 过程:
定义:procedure DecodeDate(Date: TDateTime; var Year,Day: Word);
作用:输入一个TDateTime类型的日期,将其转为年(Year),月(Month),日(Day)的值。如果输入值为0或小于0,则年月日均为0,

EncodeTime 函数:
定义:EncodeTime(Hour,Min,Sec,MSec: Word): TDateTime;
作用:输入小时(Hour),分(min),秒(Sec),微秒(MSec)的值,返回一个TDateTime类型的时间,该值为一个介于0至1之间的小数。Hour的取值范围为0-23,Min的取值范围为0-59,Sec的取值范围为0-59,MSec的取值范围为0-999,如果输入值超出范围,则产生一个EConvertError 错误。

DecodeTime 过程:
定义:procedure DecodeTime(Time: TDateTime; var Hour,MSec: Word);
作用:输入一个时间,将其转换为小时(Hour),微秒(MSec)的值。

TDateTime类型与字符串型转换函数:

DateTimeToStr 函数:
DateToStr 函数
TimeToStr函数
定义:function DateTimeToStr(DateTime: TDateTime): string;
function TimeToStr(Time: TDateTime): string;
function TimeToStr(Time: TDateTime): string;
作用:将一个TDateTime类型的数转换成字符串,DateTimeToStr转换日期和时间,DateToStr只转换日期,TimeToStr只转换时间。转换后的输出效果为YYYY-M-D H:M:S

StrToDateTime函数
StrToDate函数
StrToTime函数
定义:function StrToDateTime(const S: string): TDateTime;
function StrToDate(const S: string): TDateTime;
function StrToTime(const S: string): TDateTime;
作用:将带有日期时间格式的字符串转化成TDateTime,其中S必须是一个有效的字符串,如
YY-MM-DD HH:MM:SS格式,否则就会触发EConvertError事件,提示错误信息。
时间部分的字符串必须是由2~3个的数值字串构成,并且采用在Windows区域设置中设置的分隔字符进行分隔,其格式要求符合在Windows区域设定中的设定,其中HH,MM(小时,分钟)必须添加,SS(秒)可选,也可以在后面加入 Am和Pm区分上下午,这时候系统将认为采用12小时表示法,否则认为采用24小时表示法。
日期部分的格式要求符合Windows区域设置中的短日期格式,也是由2~3个的数值字串构成,如果在字符串中只有2个数,则认为是指定了月份和日期,年份采用当前年份,
如果在区域设置中采用两位年份的表示方法,则系统将会采用以下方法处理:
当前年份 起始年份 基准值 输入年份03 输入年份50 输入年份68
1998 0 1900 1903 1950 1968
2002 0 2000 2003 2050 2068
1998 50 1948 2003 1950 1968
2000 50 1950 2003 1950 1968
2002 50 1952 2003 2050 1968
2020 50 1970 2003 2050 2068
2020 10 2010 2103 2050 2068
首先在区域设置中取得两位年份的起始年份,如在区域设置中设两位年份范围为1932-2031年,则起始年份为32年,如果这个起始年份为0,则认为两位年份表示的都是本世纪,如果其实年份大于0 ,则采用当前年份减去起始年份的值,这个值称为基准值,大于等于这个值则认为事本世纪,否则认为是下世纪,下面给出几个例子说明:

DateTimeToString 过程:
FormatDateTime 函数:
定义:procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime);
function FormatDateTime(const Format: string; DateTime: TDateTime): string;
作用:通过定义Format字串中的格式得到要输出时间字符串,例如要输出“今天是2002年5月5日,星期五”就可以用这两种方法,这两个方法的作用相同,只是一个是通过共享变量取得输出字符串,值在Result中,一个是通过返回值取得输出字符串,DateTime参数是希望输出的日期值,Format由格式标志与附加字符串组合而成。附加字串用””圈起,就像C中的Printf函数.如“今天是2002年5月5日,星期五”的Format值就是 ‘”今天是”yyyy”年”mm”月”dd”日,” dddd',yyyy,mm,dd,dddd都是格式标识,各种格式标识的解释如下:
d :用一位或两位整数显示日子(1-31)
dd :用两位整数显示日子,不足两位的用0补足(01-31)
ddd :按缩略方式显示当前的星期号,如果Windows是英文版,则显示为Mon-Sun,如果是中文版,则显示同dddd。
dddd :按完整方式显示当前的星期号,如Windows是英文版,则显示Monday-SumDay,如果是中文版,则显示星期一~星期日
ddddd :按区域设置中的短日期格式输出。
dddddd :按区域设置中的长日期格式输出。
m :用一位或两位整数显示月份(1-12)
mm :用两位整数显示月份,不足两位的用0补足(01-12)
mmm :使用缩略方式显示月份名称,英文版显示为Jan-Dec,中文版同mmmm
mmmm :使用完整方式显示月份名称,英文版显示为January-December,中文版为一月~十二月
yy :按两位整数方式显示年份(00-99)
yyyy :按四位整数方式显示年份(0000-9999)
h :用一位或两位整数显示小时(0-23)
hh :用两位整数显示小时,不足两位的用0补足(00-23)
n :用一位或两位整数显示分钟(0-60)
nn :用两位整数显示分钟,不足两位的用0补足(00-60)
s :用一位或两位整数显示秒数(0-60)
ss :用两位整数显示秒数,不足两位的用0补足(00-60)
z :用一位至两位整数显示毫秒数(0-999)
zzz :用三位整数显示毫秒数,不足三位的用0补足(000-999)
tt :按照区域设置中的格式显示日期
am/pm :用于12小时制的显示,带有AM的则表示从0点~12点,pm代表从12点~0点。

与时间相关的变量:

Delphi封装了区域设置的各种信息,并以此定义了一系列的变量,下面介绍与时间相关的部分变量:

DateSeparator :Char
日期分隔符,用于分隔年月日

TimeSeparator :Char
时间分隔符,用于分隔小时,分钟,秒

ShortDateFormat:String
区域设置中短日期格式的定义。

LongDateFormat :String
区域设置中长日期格式的定义。

ShortTimeFormat:String
区域设置中短时间格式的定义。

LongTimeFormat :String
区域设置中长时间格式的定义。

TimeAMString :String
用来表示上午的字符串

TimePMString :String
用来表示下午的字符串

ShortMonthNames:array[1..12] of String;
用于缩略表示月份名称的数组,就是在使用FormatDateTime时显示的mmm标识的字符串

LongMonthNames:array[1..12] of String;
用于完整表示月份名称的数组,就是在使用FormatDateTime时显示的mmmm标识的字符串

ShortDayNames :array[1..7] of String;
用于缩略表示星期名称的数组,就是在使用FormatDateTime时显示的ddd标识的字符串

LongDayNames :array[1..7] of String;
用于完整表示星期名称的数组,就是在使用FormatDateTime时显示的ddd标识的字符串

TwoDigitYearCenturyWindow:Word = 50;
在使用两位年份时的起始年份。

好了,至此delphi中关于时间操作的部分基本讲完了,读者在实际编程运用的时候还可根据自身需要查看相应的帮助文件解决遇到的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。可能是作者故意这样做的?本文最后提供修正后的下载地址。原文如下:一、关于API Hook1.什么是API Hook不知道大家是否还记得,在DO
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。 这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。需要修改mess.pas中代码才行。其实文中提到的一个结构,代码中并没有使用typePIMAGE_IMPORT_DESCRIPTOR = ^IMA
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把部分api 翻译成了dephi版的 记录一下 地址 ffmpegvcl.zip
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:(dst) <--(src) 1.dst和src类型必须匹配,即必须同为字节
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂,比较少用。 2.WinExec主要运行EXE文件。如:WinExec('Notepad.exe Readme.txt', SW_SHOW); 3.ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。 首先必须引用shellapi
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) 参数 类型及说明 lpExistingFileName String,欲移
附带通用控件安装方法: ---------- 基本安装 1、对于单个控件,Componet-->install component..-->PAS或DCU文件-->install; 2、对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可; 3、对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可; 4
type   TRec=Record     msg:string;     pic:TMemoryStream; end; procedure TForm2.BitBtn1Click(Sender: TObject); var   ms:TMemoryStream;   Rec1,Rec2:TRec;   cc:tmemorystream;   jpg:TJPEGImage; begin   R
program Project1; { Types and Structures Definition } type   WNDCLASSEX = packed record     cbSize: LongWord;     style: LongWord;     lpfnWndProc: Pointer;     cbClsExtra: Integer;     cbWndExtra: In
   在Windows大行其道的今天,windows界面程序受到广大用户的欢迎。对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制。有时,对于繁杂 的,或重复性的操作,我们能否通过编制程序来代替手工输入,而用程序来模拟键盘及鼠标的输入呢?答案是肯定的。这主要是通过两个API函数来实现的。      下面以Delphi为例来介绍一下如何实现这两个功能。模拟键盘我们用Keybd_event这个ap
delphi中经常见到以下两种定义 Type TMouseProc = procedure (X,Y:integer); TMouseEvent = procedure (X,Y:integer) of Object; 两者样子差不多但实际意义却不一样, TMouseProc只是单一的函数指针类型; TMouseEvent是对象的函数指针,也就是对象/类的函数/方法 区
Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处:     (1)不用登陆进系统即可运行.     (2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.     笔者在2003年为一公司开发机顶盒项目的时候,曾经写过课件上传和媒体服务,下面就介绍一下如何用Delphi7创建一个Service程序.     运行Delphi7,选
方法一: 1.调试delphi 写的服务程序,有这么一个办法。原来每次都是用attach to process方法,很麻烦。并且按照服务线程的执行线路,可能会停不到想要的断点。笨办法是,在procedure TsvcFrm.ServiceExecute(Sender: TService);中想要下断的语句前加个人定胜天的sleep(20000),但实际上这种办法是主观臆测的。可行,没问题。记得大学
Delphi For iOS开发指南(17):让应用程序禁止竖屏(也就是只显示横屏)     最近好多人问,怎么样让Delphi For iOS开发的应用程序禁止竖屏,也就是想让它一直横屏显示,横屏是好,一行可以放好几个控件,表格的话也可以多显示几列,看起来方便。 只要一句代码就可以让Delphi For iOS开发的应用程序禁止竖屏,如下: Application.FormFactor.Orie
一个比较完整的Inno Setup 安装脚本,增加了对ini文件设置的功能,一个安装包常用的功能都具备了。 [Setup] ; 注: AppId的值为单独标识该应用程序。 ; 不要为其他安装程序使用相同的AppId值。 ; (生成新的GUID,点击 工具|在IDE中生成GUID。) AppId={{A9861883-31C5-4324-BD9A-DC3271EEB675} ;程序名 AppName
在Delphi自带的Indy控件中其实是提供了MD2,MD4,MD5对象的,我们可以直接使用它们来完成MD5的签名算法。而不需要再去找其它的DLL或是Pas了。 在Uses单元中引用 IdHashMessageDigest,IdGlobal, IdHash 单元,再写如下代码即可以达到MD5的实现。 示例代码 procedure TForm1.Button1Click(Sender: TObjec
在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下: 1 2 3 4 5 6 7 8 9 _NOTIFYICONDATAA = record    cbSize: DWORD;    Wnd: HWND;    uID: UINT;    uFlags: UINT;    uCallback
声明: 1. type Name = Existing type; 2. type Name = type Existing type; 3. type Name = (EnumValue1 [=value], EnumValue2 [=value] ...); 4. type Name = Expression1..Expression2; 5. type Name = ^Existing ty