zl程序教程

您现在的位置是:首页 >  其它

当前栏目

Delphi中对时间操作方法汇总

时间 汇总 操作方法 Delphi
2023-06-13 09:15:38 时间

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

TDateTime类型:

Delphi中最常用的表示日期时间的数据类型TDateTime类型,和普通的整形数一样,你可以给日期定义一个日期型变量以便在程序中进行操作。TdateTime类型实质上是一个Double型的数,在Delphi中是这样定义TdateTime类型:typeTDateTime=typeDouble,具体的算法是用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类型的交互关系
012/30/189900:00:00
2.751/1/190018:00:00
-1.2512/29/18996:00:00
350651/1/199600: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函数:
定义:functionDayOfWeek(Date:TDateTime):Integer;
作用:得到指定日期的星期值,返回1~7,代表周日到周六。

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

Date1:=IncMonth(date,10);

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

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

ifisLeapYear(2000)thenShowMessage(‘该年是闰年");

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

CurrentDateTime:=Now;

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

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

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

CurrentTime:=Time;

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

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

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

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

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

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

DecodeDate过程:
定义:procedureDecodeDate(Date:TDateTime;varYear,Month,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过程:
定义:procedureDecodeTime(Time:TDateTime;varHour,Min,Sec,MSec:Word);
作用:输入一个时间,将其转换为小时(Hour),分(min),秒(Sec),微秒(MSec)的值。

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

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

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

DateTimeToString过程:
FormatDateTime函数:
定义:procedureDateTimeToString(varResult:string;constFormat:string;DateTime:TDateTime);
functionFormatDateTime(constFormat: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]ofString;
用于缩略表示月份名称的数组,就是在使用FormatDateTime时显示的mmm标识的字符串

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

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

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

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

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