Delphi⽇期时间函数详解
各种时间类型之间的转换函数
●DateTimeToFileDate函数:
定义:DateTimeToFileDate(DateTime: TDateTime): Integer;
作⽤:将⼀个TDateTime类型的时间转化为Dos环境中的时间,Dos环境下对时间的访问⽅法和VCL中的TdateTime类型不⼀样,在进⾏⽂件操作时,为了保持时间的⼀致性,需要使⽤DateTimeToFileDate函数进⾏转化,返回的Integer的值就是Dos下的⽤于描述时间的值。
●DateTimeToSystemTime 过程:
定义:procedure DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TS ystemTime);
作⽤:将⼀个TDateTime类型的时间转换为Win API函数所使⽤的TSystemTime类型,在使⽤WinApi函数操纵时间时⽤到。
●SystemTimeToDateTime 函数:定义:function SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTim e;
作⽤:将⼀个在WinApi函数中得到的TSysTemTime类型的数转换为TDateTime类型。
●DateTimeToTimeStamp 函数: TimeStampToDateTime 函数:
定义:DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
作⽤:⽤于在TDataTime类型与TTimeStamp之间进⾏互相转换。TDataTime ⽤⼀个doubl e描绘⼀个时间,⽽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, 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,如果输⼊值超出范围,则产⽣⼀个EC onvertError 错误。
●DecodeTime 过程:
定义:procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);
作⽤:输⼊⼀个时间,将其转换为⼩时(Hour),分(min),秒(Sec),微秒(MSec)的值。
TDateTime类型与字符串型转换函数:
●DateTimeToStr 函数: DateToStr 函数 TimeToStr函数
定义:function DateTimeToStr(DateTime: TDateTime): string;
function TimeToStr(Time: TDateTime): string;
function TimeToStr(Time: TDateTime): string;
作⽤:将⼀个TDateTime类型的数转换成字符串,DateTimeToStr转换⽇期和时间,Date ToStr只转换⽇期,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个数,则认为是指定了⽉份和⽇期,年份采⽤当前年份,
如果在区域设置中采⽤两位年份的表⽰⽅法,则系统将会采⽤以下⽅法处理:
⾸先在区域设置中取得两位年份的起始年份,如在区域设置中设两位年份范围为 1932-2031年,则起始年份为32年,如果这个起始年份为0,则认为两位年份
表⽰的都是本世纪,如果其实年份⼤于0 ,则采⽤当前年份减去起始年份的值,这个值称为基准值,⼤于等于这个值则认为事本世纪,否则认为是下世纪。
●DateTimeToString 过程: FormatDateTime 函数:
定义:procedure DateTimeToString(var Result: string; const Format: string; D ateTime: TDateTime);
function FormatDateTime(const Format: string; DateTime: TDateTime): s tring;
作⽤:通过定义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; 在使⽤两位年份时的起始年份。
Unit DateUtils
●function DateOf(const AValue: TDateTime): TDateTime;
描述使⽤ DateOf 函数⽤来把⼀个 TDateTime 类型的变量转变成⼀个只带有⽇期的 TDateTime 类型变量。例如: showmessage(DateTimetostr(dateof(now())));你得到的是 2003/03/19 ⽽ showmessage(DateTimetostr((now()))); 得到的是 2003/03/19 10:50:49
●function DateTimeToStr(DateTime: TDateTime): string;
描述 DateTimeToString 函数将 TDateTime 类型的参数 DateTime 转换成⼀个字符串,使⽤给定的全局变量 ShortDateFormat 的格式,时间部分按照给定的全局变量 LongTimeFormat 的格式。其中 DateTime 为零的部分将不会显⽰出来。
例如: ShortDateFormat:='yyyy mm dd'; showmessage(DateTimetostr((now()))); 你将得到:2003 03 19 10:50:49
●procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime);
描述: DateTimeToString ⽅法将TDateTime类型的参数DateTime 按照由参数Format提供的格式转化成字符串,并保存在Result中。对于Format的格式类型,请看 Date-Time format strings 的帮助。
例如:  DateTimeToString(result,'yyyy mm dd',now()); 那么 result的结果为:2003 03 19 10:50:49
●procedure DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TSystemTime);
描述:有时为了调⽤API函数来使⽤系统时间,你可以使⽤ DateTimeToSystemTime ⽅法,来将⼀个 TDateTime 类型的时间变量转换成⼀个 TSystemTime 类型的系统时间。
●function DateTimeToUnix(const AValue: TDateTime ): Int64;
描述:使⽤ DateTimeToUnix 函数来将⼀个 TDateTime 型时间变量转换成⼀个相应的 Unix 格式的⽇期和时间。 Unix date-and-
time values are encoded as the number of seconds that have elapsed since midnight at the start of January 1, 1970.
●function DateToStr(Date: TDateTime): string;
描述:使⽤ DateToStr 函数能得到 TDateTime ⽇期时间类型的⽇期部分。⽇期的转换格式依赖于全局变量 ShortDateFormat。
●function DayOf(const AValue: TDateTime): Word;
描述:对于给定的TDateTime类型的⽇期时间,使⽤ DayOf 函数能得到该⽇期是该⽉份的第⼏天。该函数的返回数值在 1 到 31 之间注意:DayOf 函数得到的结果与 DayOfTheMonth 相同。
例如: showmessage(inttostr(dayof(now))); 得到的是:19 (今天是某⽉19⽇)
●function DayOfTheMonth(const AValue: TDateTime): Word;
与 DayOf 相同。
●function DayOfTheWeek(const AValue: TDateTime): Word;
描述:对于给定的TDateTime类型的⽇期时间,使⽤ DayOfTheWeek 函数能得到该⽇期是该星期的第⼏天。DayOfTheWeek 函数的返回数值为 1 到 7,其
中 1 表⽰星期⼀,⽽ 7 表⽰星期⽇。注意:DayOfTheWeek 是 ISO 8601 标准的(此标准为星期⼀是⼀周的第⼀天)。对于⼀周的第⼀天是星期⽇的标准,如果想获得星期数,请使⽤ DayOfWeek 函数。 Tip: To make the return value more readable, use the Day of week constants.
●function DayOfTheYear(const AValue: TDateTime): Word;
描述:根据给定的⽇期时间参数AValue,使⽤ DayOfTheYear 函数能得到在该⽇期所在的年份中,该⽇期按照顺序所计算的天数。因此,作为TDateTime类型的变量 “1⽉1⽇”在该函数所得到的结果为 1 ,“1⽉2⽇”所得到的结果为 2,“2⽉1⽇”所得到的结果就为 32,依次类推。
●function DayOfWeek(Date: TDateTime): Integer;
Description
DayOfWeek returns the day of the week of the specified date as an integer between  and 7, where Sunday is the first day of the week and Saturday is the seventh. Note: DayOfWeek is not compliant with the ISO 8601 standard, which defines Monday as the first day of the week.
For an ISO 8601 compliant version, use the DayOfTheWeek function instead.
描述:按照给定的TDateTime类型的参数Date,DayOfWeek 函数得到⼀周中的第⼏天,从1到7。这⾥星期⽇是⼀周的第⼀天,⽽星期六是第七天。
●function DaysBetween(const ANow, AThen: TDateTime): Integer;
描述:根据两个TDateTime类型的⽇期时间变量 ANow 和 AThen,DaysBetween函数能得到两者之间
的天数的差距。 DaysBetween 仅仅根据天数的不同来计算。因此,对于 1999年12⽉31⽇下午11点59分到 2000年1⽉1⽇ 11点58分,该函数得到的结果是 0,因为两者之间的时间差别还差 1 分钟才到 1 天。
●function DaysInAMonth(const AYear, AMonth: Word): Word;
描述:对于各定的年份和⽉份,DaysInAMonth 函数能得到该⽉份的总天数。年份应该为从 1 到 9999 ⽉份应该为从 1 到 12
●function DaysInAYear(const AYear: Word): Word;
描述:对于给定的年份,DaysInAYear函数能得到该年份的总天数。年份应该为 1 到 9999。
●function DaysInMonth(const AValue: TDateTime): Word;
描述:根据给定的TDateTime类型的时间⽇期参数AValue,DaysInMonth函数能得到该⽉份的总天数。
●function DaysInYear(const AValue: TDateTime): Word;
描述:根据给定的TDateTime类型的时间⽇期参数AValue,DaysInYear函数能得到该年份的总天数。
●function DaySpan(const ANow, AThen: TDateTime): Double;
描述:根据两个TDateTime类型的⽇期时间参数ANow和AThen,DaySpan能得到在天数上的差距。与 DaysBetween 函数不同,DaysBetween 函数只是计
算整的天数,⽽ DaySpan函数会将不⾜⼀天的数也得到。注意:此函数返回的数值为 Double 型。
Month 开头的函数
●function MonthOf(const AValue: TDateTime): Word;
描述:根据给定的TDateTime类型的时间⽇期参数AValue,MonthOf函数能得到该年份的该⽉份数。 MonthOf返回数值为 1 到 12。注意:MonthOf函数得到的数值与MonthOfTheYear函数相同
●function MonthOfTheYear(const AValue: TDateTime): Word;
与MonthOf函数相同。
●function MonthsBetween(const ANow, AThen: TDateTime): Integer;
描述:根据两个给定的TDateTime类型的参数ANow和AThen,MonthsBetween函数能得到两个⽇期在
⽉份上差距数。因为⽉份的天数是不同的,所
以 MonthsBetween 函数返回的是⼀个近似值,该近似值基于每个⽉份为 30.4375 天。不⾜⼀个⽉的数字将不被计算。因此,例如,对于 2⽉1⽇到 2⽉28
⽇,MonthsBetween 返回的数值为 0。同样,对于 2⽉1⽇到 3⽉1⽇,MonthsBetween 返回的数值也是 0。
●function MonthSpan(const ANow, AThen: TDateTime): Double;
描述:根据两个给定的TDateTime类型的参数ANow和AThen,MonthsBetween函数能得到两个⽇期在⽉份上差距数。因为⽉份的天数是不同的,所
以 MonthsBetween 函数返回的是⼀个近似值,该近似值基于每个⽉份为 30.4375 天。与 MonthsBetween 函数不同,MonthsBetween函数不计算不⾜⼀个⽉的数字,MonthSpan函数将会得到不⾜⼀个⽉的数字。注意:此函数返回的类型为 Double
●function MonthStr(DateTime: TDateTime): string;
Description
HTTP message headers permit several formats for the representation of date and time  values.
MonthStr converts a TDateTime value into a string representing the month.
MonthStr allows server applications to work with date values taken from HTTP request  messages, without worrying about the details of how they are formatted.
●function WeekOf(const AValue: TDateTime): Word;
描述:根据TDateTime类型的⽇期时间参数AValu,WeekOf函数会得到该星期为⼀年的第⼏个星期。
●function WeeksInAYear(const AYear: Word): Word;
描述: WeeksInAYear 函数根据年份得到在该年份中共包含多少个星期。
●function WeeksBetween(const ANow, AThen: TDateTime): Integer;
描述:根据两个TDateTime类型的⽇期时间参数ANow和AThen,WeeksBetween函数将得到这两个时间在星期上的差数。如果差数不⾜⼀个星期,则忽略掉。
●function WeekSpan(const ANow, AThen: TDateTime): Double;
描述:根据两个TDateTime类型的⽇期时间参数ANow和AThen,WeeksBetween函数将得到这两个时间在星期上的差数。如果差数不⾜⼀个星期,则WeekSpan函数不会忽略掉。注意:此函数的返回类型为 Double
Year 开头的函数
●function YearOf(const AValue: TDateTime): Word;
描述:根据给定的TDateTime类型的⽇期时间参数AValue,YearOf函数能得到该⽇期的年份数字。 YearOf函数返回的数值为从 1 到 9999
●function YearsBetween(const ANow, AThen: TDateTime): Integer;
描述:根据两个给定的TDateTime类型的参数ANow和AThen,YearsBetween函数能得到两个⽇期在年份上差距数。因为年份的天数是不同的,所
以 YearsBetween 函数返回的是⼀个近似值,该近似值基于每年的天数为 365.25 天。不⾜的⼀年的差距将不会被计算。因此例如:对于 1⽉1⽇和12⽉31⽇,如果这两个⽇期在同⼀年,则 YearsBetween 返回数值为 0;如果这两个⽇期在临近的年份,则 YearsBetween 函数返回数值为 1。
●function YearSpan(const ANow, AThen: TDateTime): Double;
描述:根据两个给定的TDateTime类型的参数ANow和AThen,YearsBetween函数能得到两个⽇期在年份上差距数。因为年份的天数是不同的,所
以 YearsBetween 函数返回的是⼀个近似值,该近似值基于每年的天数为 365.25 天。与 YearsBetween 函数不同,YearsBetween函数将忽略掉不⾜⼀年的数字,⽽ YearSpan 将计算不⾜⼀年的数字。注意:该函数返回类型为Double
●function Yesterday: TDateTime;
描述: Yesterday函数能得到当前⽇期的前⼀天的⽇期,返回数值中不包括时间部分。例如:当前⽇期是 2003/3/19 则 showmessage(datetimetostr(Yesterday));将得到 2003/3/18
⽇期的合成
●function EncodeDate(Year, Month, Day: Word): TDateTime;
描述: EncodeDate函数将根据参数年份、⽉份、⽇⼦⽽得到⼀个TDateTime类型的时间变量。
●function EncodeDateDay(const AYear, ADayOfYear: Word): TDateTime;
描述: EncodeDateDay将根据参数年份和天数,⽽得到⼀个TDateTime类型的时间变量。其中AYear 为 1 到 9999。 ADayOfYear 为⽇⼦在该年份顺序排列的天数,例如,1⽉1⽇时,ADayOfYear为1, 2⽉2⽇时,ADayOfYear为2,3⽉1⽇时,ADayOfYear为32。
●function EncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth: Word; const ADayOfWeek: Word =
1): TDateTime;
描述: EncodeDateMonthWeek 函数将根据参数年份、⽉份、星期数,星期⼏,来得到⼀个TDateTime类型的时间变量。其中AYear 为 1 到 9999。其中AMonth 为 1 到 12。 AWeekOfMonth是在该⽉份的星期数,1 表⽰第⼀个星期,可能包含4天或更多的天数。注意,⼀个⽉的第⼀天如果是星期5,星期6或星期⽇,⽤表⽰这三天的AMonth数值必须设定为上⼀个⽉份的数字,同时 AWeekOfMonth 要设为在上⼀个⽉所在的星期数。同样,如果⼀个⽉的最后⼀天是星期1,星期2,或星期3,那么⽤表⽰这三天的AMonth数值必须设定为下⼀个⽉份的数字,同时 AWeekOfMonth 为 1。 ADayOfWeek表⽰星期⼏,星期⼀为1,星期⼆为2。
●function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond:
Word):TDateTime;
描述: EncodeDateTime 根据参数年份、⽉份、⽇⼦、⼩时、分、秒、毫秒来得到⼀个TDateTime类型⽇期时间。
●function EncodeDateWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 1): TDateTime;
描述:
EncodeDateWeek 根据参数年份、星期数、星期⼏来得到⼀个TDateTime类型⽇期时间。
AWeekOfYear是在该年份的星期数,1 表⽰第⼀个星期,可能包含4天或更多的天数。注意,⼀年的第⼀天如果是星期5,星期6或星期⽇,⽤表⽰这三天的AYear数值必须设定为上⼀个年份的数字,同时 AWeekOfYear 要设为在上⼀个年所在的星期数。同样,如果⼀年的最后⼀天是星期1,星期2,或星期3,那么⽤表⽰这三天的AYear数值必须设定为下⼀个年份的数字,同时 AWeekOfYear 为 1。 ADayOfWeek表⽰星期⼏,星期⼀为1,星期⼆为2。
●function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
描述: EncodeTime函数根据参数⼩时、分、秒、毫秒得到个⼀个TDateTime数值。
⽇期的分解
●procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);
描述: DecodeDate从⼀个TDateTime类型参数Date中分解出得到年份、⽉份、⽇⼦。
●procedure DecodeDateDay(const AValue: TDateTime; out AYear, ADayOfYear: Word);
描述: DecodeDateDay ⽅法会根据TDateTime类型参数AValue 得到相应的年份和⽇期总数。 ADayOfYear:1⽉1⽇,此数值为1;1⽉2⽇,此数值为2。
●procedure DecodeDateMonthWeek(const AValue: TDateTime; out AYear, AMonth, AWeekOfMonth,
ADayOfWeek: Word);
描述: DecodeDateMonthWeek⽅法根据TDateTime类型参数AValue 得到相应的年份、⽉份、⽉份中的第⼏个星期、星期⼏ AYear:年份 AMonth:⽉
份,1 到 12 AWeekOfMonth:在该⽉份中的第⼏个星期 ADayOfWeek:星期⼏。星期⼀为1。
●procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute,
ASecond, AMilliSecond: Word);
描述: DecodeDateTime ⽅法根据TDateTime类型参数AValue 得到相应的年份、⽉份、⽇⼦、⼩时、分、秒、毫秒。
●procedure DecodeDateWeek(const AValue: TDateTime; out AYear, AWeekOfYear, ADayOfWeek: Word);
描述: DecodeDateWeek⽅法根据TDateTime类型参数AValue 得到相应的年份、在该年中的第⼏个星期、星期⼏。