一般來(lái)說(shuō)在delphi中用于描述時(shí)間的有幾種數(shù)據(jù)結(jié)構(gòu),而對(duì)時(shí)間的操作,實(shí)質(zhì)上就是對(duì)這些結(jié)構(gòu)的操作。
TDateTime類(lèi)型:
Delphi中最常用的表示日期時(shí)間的數(shù)據(jù)類(lèi)型TDateTime類(lèi)型,和普通的整形數(shù)一樣,你可以給日期定義一個(gè)日期型變量以便在程序中進(jìn)行操作。TdateTime類(lèi)型實(shí)質(zhì)上是一個(gè)Double型的數(shù),在Delphi中是這樣定義TdateTime類(lèi)型: type TDateTime = type Double ,具體的算法是用Double數(shù)的整數(shù)部分表示日期,以1989年12月30日為基準(zhǔn)點(diǎn),以天為單位進(jìn)行加減,如數(shù)字1表示1900年1月1日,數(shù)字-1表示1989年12月29日。而小數(shù)部分則用來(lái)表示時(shí)間,其值為欲表示的時(shí)間與一整天總時(shí)間的比值,如早上6點(diǎn)就是6/24=0.25,而早上6:15就是(6*60+15)/(24*60)=0.2604166666666666666666666666667,下面,給出幾個(gè)例子說(shuō)明TDateTime類(lèi)型 與Double類(lèi)型的交互關(guān)系
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之間的轉(zhuǎn)換方法,因此,從根本上對(duì)TDateTime的操作與Double完全一樣。
TTimeStamp 類(lèi)型:
這是一個(gè)用來(lái)描述日期與時(shí)間的一個(gè)結(jié)構(gòu)類(lèi)型,在Delphi中是這樣定義的:
type TTimeStamp = record Time: Integer; {從午夜0點(diǎn)開(kāi)始到指定時(shí)間的毫秒數(shù) } Date: Integer; {以本日為基準(zhǔn)到指點(diǎn)日期的天數(shù)} end;
和TDateTime相比,可更直觀表示高精度的時(shí)間,一般用于毫秒級(jí)的運(yùn)算以及用于表示較長(zhǎng)的時(shí)間。
PsystemTime 類(lèi)型:
一個(gè)用于WinApi中對(duì)時(shí)間操作的指針型結(jié)構(gòu)。他的定義為:
type PSystemTime = ^TSystemTime; TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end;
這個(gè)結(jié)構(gòu)多用于調(diào)用WinApi操作時(shí)使用。
在了解了各種時(shí)間類(lèi)型的本質(zhì)后,相信大家都有一套操作這些類(lèi)型的時(shí)間的想法,不過(guò)在Delphi中還提供了一整套用于操作時(shí)間的過(guò)程函數(shù),這些過(guò)程和函數(shù)都定義在SysUnit這個(gè)單元中,現(xiàn)在就向大家介紹Delphi中相關(guān)函數(shù):
用于時(shí)間操作的函數(shù)
Date函數(shù):
定義:Date: TDateTime;
作用:返回當(dāng)前的日期
范例:
CurrentDate := Date;
DayOfWeek函數(shù):
定義:function DayOfWeek(Date: TDateTime): Integer;
作用:得到指定日期的星期值,返回1~7,代表周日到周六。
IncMouth函數(shù):
定義:function IncMonth(const Date: TDateTime; NumberOfMonths: Integer): TDateTime;
作用:求給定的日期Data在NumberOfMonths個(gè)月后的日期。
范例:
Date1 := IncMonth(date,10);
如果今天是2002-5-3,則Date1就是2003-3-3
IsLeapYear函數(shù):
定義:function IsLeapYear(Year: Word): Boolean;
作用:判斷指定的年份是否是閏年;
范例:
if isLeapYear(2000) then ShowMessage(‘該年是閏年');
Now函數(shù):
定義:function Now: TDateTime;
作用:用于取得當(dāng)前的日期時(shí)間
范例:
CurrentDateTime := Now;
ReplaceDate 過(guò)程
定義:procedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime);
作用:使用參數(shù)Newdate日期部分替換參數(shù)DateTime的日期部分,但不改變時(shí)間部分。
ReplaceDate 過(guò)程
定義:procedure ReplaceTime(var DateTime: TDateTime; const NewTime: TDateTime);
作用:使用參數(shù)Newdate時(shí)間部分替換參數(shù)DateTime的時(shí)間部分,但不改變?nèi)掌诓糠帧?
如果上述這兩個(gè)過(guò)程一起用,就相當(dāng)于賦值了。
Time函數(shù):
定義:function Time: TDateTime;
作用:返回當(dāng)前的時(shí)間
范例:
CurrentTime := Time;
各種時(shí)間類(lèi)型之間的轉(zhuǎn)換函數(shù)
DateTimeToFileDate函數(shù):
定義:DateTimeToFileDate(DateTime: TDateTime): Integer;
作用:將一個(gè)TDateTime類(lèi)型的時(shí)間轉(zhuǎn)化為Dos環(huán)境中的時(shí)間,Dos環(huán)境下對(duì)時(shí)間的訪問(wèn)方法和VCL中的TdateTime類(lèi)型不一樣,在進(jìn)行文件操作時(shí),為了保持時(shí)間的一致性,需要使用DateTimeToFileDate函數(shù)進(jìn)行轉(zhuǎn)化, 返回的Integer的值就是Dos下的用于描述時(shí)間的值。
DateTimeToSystemTime 過(guò)程:
定義:procedure DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TSystemTime);
作用:將一個(gè)TDateTime類(lèi)型的時(shí)間轉(zhuǎn)換為Win API函數(shù)所使用的TSystemTime類(lèi)型,在使用WinApi函數(shù)操縱時(shí)間時(shí)用到。
SystemTimeToDateTime 函數(shù):
定義:function SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime;
作用:將一個(gè)在WinApi函數(shù)中得到的TSysTemTime類(lèi)型的數(shù)轉(zhuǎn)換為T(mén)DateTime類(lèi)型。
DateTimeToTimeStamp 函數(shù):
TimeStampToDateTime 函數(shù):
定義:DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
作用:用于在TDataTime類(lèi)型與TTimeStamp之間進(jìn)行互相轉(zhuǎn)換。TDataTime 用一個(gè)double描繪一個(gè)時(shí)間,而TTimeStamp則是采用兩個(gè)整形數(shù)分別描述時(shí)間。兩種類(lèi)型的區(qū)別可參考文章開(kāi)始處的數(shù)據(jù)類(lèi)型描述部分。
EncodeDate 函數(shù):
定義:function EncodeDate(Year, Month, Day: Word): TDateTime;
作用: 輸入年(year),月(month),日(day)的值,將該日期返回為T(mén)DateTime類(lèi)型,年的范圍為1-9999,月份的范圍為1-12,日期的范圍視當(dāng)月的情況而定,如果輸入的值超出范圍,則將產(chǎn)生一個(gè)EConvertError錯(cuò)誤。
DecodeDate 過(guò)程:
定義:procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);
作用:輸入一個(gè)TDateTime類(lèi)型的日期,將其轉(zhuǎn)為年(Year),月(Month),日(Day)的值。如果輸入值為0或小于0,則年月日均為0,
EncodeTime 函數(shù):
定義:EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
作用:輸入小時(shí)(Hour),分(min),秒(Sec),微秒(MSec)的值,返回一個(gè)TDateTime類(lèi)型的時(shí)間,該值為一個(gè)介于0至1之間的小數(shù)。Hour的取值范圍為0-23,Min的取值范圍為0-59,Sec的取值范圍為0-59,MSec的取值范圍為0-999,如果輸入值超出范圍,則產(chǎn)生一個(gè)EConvertError 錯(cuò)誤。
DecodeTime 過(guò)程:
定義:procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);
作用:輸入一個(gè)時(shí)間,將其轉(zhuǎn)換為小時(shí)(Hour),分(min),秒(Sec),微秒(MSec)的值。
TDateTime類(lèi)型與字符串型轉(zhuǎn)換函數(shù):
DateTimeToStr 函數(shù):
DateToStr 函數(shù)
TimeToStr函數(shù)
定義:function DateTimeToStr(DateTime: TDateTime): string;
function TimeToStr(Time: TDateTime): string;
function TimeToStr(Time: TDateTime): string;
作用:將一個(gè)TDateTime類(lèi)型的數(shù)轉(zhuǎn)換成字符串,DateTimeToStr轉(zhuǎn)換日期和時(shí)間,DateToStr只轉(zhuǎn)換日期,TimeToStr只轉(zhuǎn)換時(shí)間。轉(zhuǎn)換后的輸出效果為YYYY-M-D H:M:S
StrToDateTime函數(shù)
StrToDate函數(shù)
StrToTime函數(shù)
定義:function StrToDateTime(const S: string): TDateTime;
function StrToDate(const S: string): TDateTime;
function StrToTime(const S: string): TDateTime;
作用:將帶有日期時(shí)間格式的字符串轉(zhuǎn)化成TDateTime,其中S必須是一個(gè)有效的字符串,如
YY-MM-DD HH:MM:SS格式,否則就會(huì)觸發(fā)EConvertError事件,提示錯(cuò)誤信息。
時(shí)間部分的字符串必須是由2~3個(gè)的數(shù)值字串構(gòu)成,并且采用在Windows區(qū)域設(shè)置中設(shè)置的分隔字符進(jìn)行分隔,其格式要求符合在Windows區(qū)域設(shè)定中的設(shè)定,其中HH,MM(小時(shí),分鐘)必須添加,SS(秒)可選,也可以在后面加入 Am和Pm區(qū)分上下午,這時(shí)候系統(tǒng)將認(rèn)為采用12小時(shí)表示法,否則認(rèn)為采用24小時(shí)表示法。
日期部分的格式要求符合Windows區(qū)域設(shè)置中的短日期格式,也是由2~3個(gè)的數(shù)值字串構(gòu)成,如果在字符串中只有2個(gè)數(shù),則認(rèn)為是指定了月份和日期,年份采用當(dāng)前年份,
如果在區(qū)域設(shè)置中采用兩位年份的表示方法,則系統(tǒng)將會(huì)采用以下方法處理:
當(dāng)前年份 起始年份 基準(zhǔn)值 輸入年份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
首先在區(qū)域設(shè)置中取得兩位年份的起始年份,如在區(qū)域設(shè)置中設(shè)兩位年份范圍為1932-2031年,則起始年份為32年,如果這個(gè)起始年份為0,則認(rèn)為兩位年份表示的都是本世紀(jì),如果其實(shí)年份大于0 ,則采用當(dāng)前年份減去起始年份的值,這個(gè)值稱(chēng)為基準(zhǔn)值,大于等于這個(gè)值則認(rèn)為事本世紀(jì),否則認(rèn)為是下世紀(jì),下面給出幾個(gè)例子說(shuō)明:
DateTimeToString 過(guò)程:
FormatDateTime 函數(shù):
定義:procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime);
function FormatDateTime(const Format: string; DateTime: TDateTime): string;
作用:通過(guò)定義Format字串中的格式得到要輸出時(shí)間字符串,例如要輸出“今天是2002年5月5日,星期五”就可以用這兩種方法,這兩個(gè)方法的作用相同,只是一個(gè)是通過(guò)共享變量取得輸出字符串,值在Result中,一個(gè)是通過(guò)返回值取得輸出字符串,DateTime參數(shù)是希望輸出的日期值,F(xiàn)ormat由格式標(biāo)志與附加字符串組合而成。附加字串用””圈起,就像C中的Printf函數(shù).如“今天是2002年5月5日,星期五”的Format值就是 ‘”今天是”yyyy”年”mm”月”dd”日,” dddd',yyyy,mm,dd,dddd都是格式標(biāo)識(shí),各種格式標(biāo)識(shí)的解釋如下:
d :用一位或兩位整數(shù)顯示日子(1-31)
dd :用兩位整數(shù)顯示日子,不足兩位的用0補(bǔ)足(01-31)
ddd :按縮略方式顯示當(dāng)前的星期號(hào),如果Windows是英文版,則顯示為Mon-Sun,如果是中文版,則顯示同dddd。
dddd :按完整方式顯示當(dāng)前的星期號(hào),如Windows是英文版,則顯示Monday-SumDay,如果是中文版,則顯示星期一~星期日
ddddd :按區(qū)域設(shè)置中的短日期格式輸出。
dddddd :按區(qū)域設(shè)置中的長(zhǎng)日期格式輸出。
m :用一位或兩位整數(shù)顯示月份(1-12)
mm :用兩位整數(shù)顯示月份,不足兩位的用0補(bǔ)足(01-12)
mmm :使用縮略方式顯示月份名稱(chēng),英文版顯示為Jan-Dec,中文版同mmmm
mmmm :使用完整方式顯示月份名稱(chēng),英文版顯示為January-December,中文版為一月~十二月
yy :按兩位整數(shù)方式顯示年份(00-99)
yyyy :按四位整數(shù)方式顯示年份(0000-9999)
h :用一位或兩位整數(shù)顯示小時(shí)(0-23)
hh :用兩位整數(shù)顯示小時(shí),不足兩位的用0補(bǔ)足(00-23)
n :用一位或兩位整數(shù)顯示分鐘(0-60)
nn :用兩位整數(shù)顯示分鐘,不足兩位的用0補(bǔ)足(00-60)
s :用一位或兩位整數(shù)顯示秒數(shù)(0-60)
ss :用兩位整數(shù)顯示秒數(shù),不足兩位的用0補(bǔ)足(00-60)
z :用一位至兩位整數(shù)顯示毫秒數(shù)(0-999)
zzz :用三位整數(shù)顯示毫秒數(shù),不足三位的用0補(bǔ)足(000-999)
tt :按照區(qū)域設(shè)置中的格式顯示日期
am/pm :用于12小時(shí)制的顯示,帶有AM的則表示從0點(diǎn)~12點(diǎn),pm代表從12點(diǎn)~0點(diǎn)。
與時(shí)間相關(guān)的變量:
Delphi封裝了區(qū)域設(shè)置的各種信息,并以此定義了一系列的變量,下面介紹與時(shí)間相關(guān)的部分變量:
DateSeparator :Char
日期分隔符,用于分隔年月日
TimeSeparator :Char
時(shí)間分隔符,用于分隔小時(shí),分鐘,秒
ShortDateFormat:String
區(qū)域設(shè)置中短日期格式的定義。
LongDateFormat :String
區(qū)域設(shè)置中長(zhǎng)日期格式的定義。
ShortTimeFormat:String
區(qū)域設(shè)置中短時(shí)間格式的定義。
LongTimeFormat :String
區(qū)域設(shè)置中長(zhǎng)時(shí)間格式的定義。
TimeAMString :String
用來(lái)表示上午的字符串
TimePMString :String
用來(lái)表示下午的字符串
ShortMonthNames:array[1..12] of String;
用于縮略表示月份名稱(chēng)的數(shù)組,就是在使用FormatDateTime時(shí)顯示的mmm標(biāo)識(shí)的字符串
LongMonthNames:array[1..12] of String;
用于完整表示月份名稱(chēng)的數(shù)組,就是在使用FormatDateTime時(shí)顯示的mmmm標(biāo)識(shí)的字符串
ShortDayNames :array[1..7] of String;
用于縮略表示星期名稱(chēng)的數(shù)組,就是在使用FormatDateTime時(shí)顯示的ddd標(biāo)識(shí)的字符串
LongDayNames :array[1..7] of String;
用于完整表示星期名稱(chēng)的數(shù)組,就是在使用FormatDateTime時(shí)顯示的ddd標(biāo)識(shí)的字符串
TwoDigitYearCenturyWindow:Word = 50;
在使用兩位年份時(shí)的起始年份。
好了,至此delphi中關(guān)于時(shí)間操作的部分基本講完了,讀者在實(shí)際編程運(yùn)用的時(shí)候還可根據(jù)自身需要查看相應(yīng)的幫助文件解決遇到的問(wèn)題。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注