一般來說在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.260416666666666666666666666667,下面,舉幾個例子說明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, 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 流程:
定義: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轉換日期和時間,DateToStr只轉換日期,TimeToStr只轉換時間。轉換後的輸出效果為YYYY-MD 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中關於時間操作的部分基本上講完了,讀者在實際編程運用的時候還可根據自身需要查看相應的幫助文件解決遇到的問題。