很多時候要用到相差多少天,多少周,多少秒,查了一下資料,整理如下:
首先 uses dateutils;
先自己做了個執行個體,相關代碼如下:
代碼
uses
dateutils;
procedure TForm1.Button1Click(Sender: TObject);
var
sd,nd:Tdatetime;
randid:string;
begin
sd := StrtoDatetime('1981-08-08 00:00:00');
nd := now;
memo1.Clear;
memo1.Lines.Add('開始測試時間差:');
memo1.Lines.Add('起始時間:1981-08-08 00:00:00');
memo1.Lines.Add('終止時間:'+datetimetostr(nd));
memo1.Lines.Add('年:'+inttostr(YearsBetween(sd,nd)));
memo1.Lines.Add('月:'+inttostr(MonthsBetween(sd,nd)));
memo1.Lines.Add('周:'+inttostr(WeeksBetween(sd,nd)));
memo1.Lines.Add('日:'+inttostr(DaysBetween(sd,nd)));
memo1.Lines.Add('時:'+inttostr(HoursBetween(sd,nd)));
memo1.Lines.Add('分:'+inttostr(MinutesBetween(sd,nd)));
memo1.Lines.Add('秒:'+inttostr(SecondsBetween(sd,nd)));
memo1.Lines.Add(#13);
memo1.Lines.Add('以秒差為例產生隨機數:');
randid := inttostr(SecondsBetween(sd,nd))+inttostr(random(9))+inttostr(random(9))+inttostr(random(9))+inttostr(random(9));//呵呵,很笨的方法。
memo1.Lines.Add(randid);
end;
end.
相關函數如下:
{ Range query functions }
function YearsBetween(const ANow, AThen: TDateTime): Integer;
function MonthsBetween(const ANow, AThen: TDateTime): Integer;
function WeeksBetween(const ANow, AThen: TDateTime): Integer;
function DaysBetween(const ANow, AThen: TDateTime): Integer;
function HoursBetween(const ANow, AThen: TDateTime): Int64;
function MinutesBetween(const ANow, AThen: TDateTime): Int64;
function SecondsBetween(const ANow, AThen: TDateTime): Int64;
function MilliSecondsBetween(const ANow, AThen: TDateTime): Int64;
{ Range spanning functions }
{ YearSpan and MonthSpan are approximates, not exact but pretty darn close }
function YearSpan(const ANow, AThen: TDateTime): Double;
function MonthSpan(const ANow, AThen: TDateTime): Double;
function WeekSpan(const ANow, AThen: TDateTime): Double;
function DaySpan(const ANow, AThen: TDateTime): Double;
function HourSpan(const ANow, AThen: TDateTime): Double;
function MinuteSpan(const ANow, AThen: TDateTime): Double;
function SecondSpan(const ANow, AThen: TDateTime): Double;
function MilliSecondSpan(const ANow, AThen: TDateTime): Double;
找到一篇關於時間函數應用的學習筆記,備份一下。
TDateTime是一個比較常用的類型,用於表達日期時間類型的資料。但是,剛剛接觸delphi的新手在使用這個類型的時候往往會不知所措,不知道該怎樣使用才能得到自己想要的結果。這裡說說我在使用過程中的一點心得,其中大部分的內容是來自於delphi協助,所以如果看了這篇文章對TDateTime還有什麼不清楚的可以去看看Delphi的協助。另外在這篇文章裡我也會告訴大家我使用協助的心得,這對老手或許是班門弄斧但是對於新手我自認為還是很有協助的。
一、關於TDateTime
1、TDateTime的基本概念:
根據Delphi的協助裡所說的,TDateTime是date和time常式用來存放date和time變數的,在delphi裡TDateTime類型本質上是Double類型的,其中整數位用於表達從1899年12月30日到現在所已經過去的天數,小數部分用於表示當天已經流逝的分數值——有些不明白吧,舉個例子:上午6點小數部分就是0.25、中午12點小數部分就是0.5依此類推。
2、常用函數和過程
2.1 Date函數
function Date: TDateTime;
返回當前的日期,實際類型是TDateTime,也就是小數部分為0的DateTime值,小數部分為0代表什麼意思呢?根據TDateTime的概念我們知道這代表午夜也就是0點。
2.2 DateToStr
函數的形式:function DateToStr(Date: TDateTime): string;
傳回值是個字串,很有用吧。不過,別高興的太早,如果你用DateToStr(DateTimePicker.Date),你會發現返回的字串可能是“04-22-03”,這是為什麼呢?這是因為delphi內部有一些系統變數用來定義數字、貨幣、日期的格式,這些變數delphi稱為Currency and date/time formatting variables,有23個。我也沒有完全看懂,這裡講幾個我搞明白的說說。
var ThousandSeparator: Char;
千分位的符號,一般都是西文的逗號“,”,預設值存放在LOCALE_STHOUSAND變數中(位於windows單元)
var DecimalSeparator: Char;
小數點的符號,一般都是西文的句號“.”,預設值存放在變數LOCALE_SDECIMAL中
var CurrencyDecimals: Byte;
小數點後面保留的位元,一般是2位,預設值存放在變數LOCALE_ICURRDIGITS中
var DateSeparator: Char;
日期的分隔字元號,一般使用“-”或“.”,預設值為“-”,預設值存放在變數LOCATE_SDATE中
var ShortDateFormat: string;
短日期格式,一般是“yyyy.mm.dd”,預設值存放在變數LOCALE_SSHORTDATE中
var LongDateFormat: string;
長日期格式,一般是“yyyy.mm.dd”,預設值存放在變數LOCALE_SLONGDATE中
var TimeSeparator: Char;
時間的分隔字元,一般是西文的分號“:”,預設值就是這個,預設值存放在變數 LOCALE_STIME中
var TimeAMString: string;
表示上午的字串,預設為“AM”,預設值存放在變數LOCALE_S1159中
var TimePMString: string;
表示下午的字串,預設為“PM”,預設值存放在變數LOCALE_S2359中
var ShortTimeFormat: string;
短時間格式,預設值存放在變數LOCALE_ITIME LOCALE_ITLZERO中
var LongTimeFormat: string;
長時間格式,一般為“hh:mm:ss”,預設值存放在變數LOCALE_ITIME and LOCALE_ITLZERO中
所以,如果想開發一個穩健的系統,那麼這些系統變數必須要在進入系統的時候進行初始化,下面是我得代碼:
SysLocale.PriLangID:=LANG_CHINESE;
DateSeparator:='.';
LongDateFormat:='yyyy.mm.dd';
ShortDateFormat:='yyyy.mm.dd';
TimeSeparator:=':';
LongTimeFormat:='hh:nn:ss';
TimeAMString:='上午';
TimePMString:='下午';
大家一定奇怪,為什麼我的LongDateFormat和ShortDateFormat是一樣的,老實講,我也希望能夠區分長短日期的格式,但是由於有些關於TDateTime的常式在類型轉換的時候要參考ShortDateFormat,所以只能設定成一樣的了。
還是繼續說DateToStr函數。其他沒什麼特別的,需要注意的是此函數是根據ShortDateFormat來進行轉換的,所以ShortDateFormat我只能設為“yyyy.mm.dd”
說道了DateTimePicker,注意在它的format屬性中設定顯示格式的時候月份要用“MM”而不是我們通常認為的“mm”。
2.3 StrToDate函數
function StrToDate(const S: string): TDateTime;
這個函數可以看成是DateToStr的逆函數,作用就是把一個字串轉換為TDateTime,參數S必須包括2個或3個數字,用DateSeparator所定義的分隔字元分隔,年月日的順序和格式遵從ShortDateFormat。如果輸入的參數不符合日期類型的規定系統會觸發EConvertError例外。
2.4 DateTimeToStr函數
function DateTimeToStr(DateTime: TDateTime): string;
把TDateTime轉換為字串,日期格式遵從ShortDateFormat,時間格式遵從LongTimeFormat,如果TDateTime的小數部分是0的話,那麼返回的字串中將沒有時間部分。
2.5 StrToDateTime函數
function StrToDateTime(const S: string): TDateTime;
這個函數可以看作是DateTimeToStr函數的逆函數,和StrToDate差不多。
2.6 DateTimeToString過程
procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime);
這個過程的作用和DateTimeToStr和DateToStr一樣,特別的地方是可以指定TDateTime的格式,這樣就可以得到我們指定格式的日期型字串了。
2.7 Now,Time,StrToTime等等就不詳細介紹了,都可以在協助裡得到相關資訊,如果有不明白的地方就寫代碼測試一下。
二、怎樣使用協助
delphi的協助不如PowerBuilder的協助那麼詳細,並且外面的書也都沒有什麼很好的詳盡講解
以Delphi6中的DateTimeToStr函數為例子,在代碼中我們選中DateTimeToStr,然後按F1就可以得到如下的協助:【】裡是說明
VCL Reference【相關的vcl refrence協助】
DateTimeToStr function【一般在說明主題的索引裡看到的就是這個】
See also Example【see also連結著相關的內容,Example連結著範例代碼】
Converts a TDateTime value to a string.【功能說明,把TDateTime類型轉換為String類型】
Unit【所屬單元】
SysUtils【說明屬於SysUtils】
Category【所屬類別】
date/time routines【說明屬於date/time常式,並且連結著date/time相關的常式——函數和過程】
function DateTimeToStr(DateTime: TDateTime): string;【函數聲名的形式】
Description【描述,詳細的說明】
DateTimeToString converts the TDateTime value given by DateTime using the format given by the ShortDateFormat global variable, followed by the time using the format given by the LongTimeFormat global variable. The time is not displayed if the fractional part of the DateTime value is zero. 【DateTimeToStr轉換通過DateTime參數傳入的TDateTime類型的值為字串,根據ShortDateFormat全域變數所給定的日期格式,遵循LongTimeFormat所給定的時間格式。如果DateTime的小數部分為零的話返回的字串中將沒有時間部分】
To change how the string is formatted, change ShortDateFormat and LongTimeFormat global date time formatting variables.【要改變字串的格式,可以通過改變ShortDateFormat和LongTimeFormat全域日期時間格式變數來實現】
三、和資料庫中的日期欄位
有人詢問怎樣在SQL中設定Date/DateTime類型的查詢值,這和資料庫本身有關。不同的資料庫對日期類型的欄位一般都有對應的函數和格式,不過應該都支援ANSI標準——誰叫資料庫廠商都是美國的。比如,我在Oracle8中要查詢日期型欄位我一般使用【Select * From LoginTable Where LoginTime >= To_Date('2003.03.01 00:00:00','yyyy.mm.dd hh24:mi:ss')】,MSSQLServer2000中文版的寫法是【Select * From LoginTable Where LoginTime >= '2003-03-01 00:00:00'】,SQLServer的線上說明中講得比較詳細,而且用起來似乎也比較方便,不過Oracle可以自己設定日期格式。
說句題外話,查詢的時候,很多人為了方便往往把日期型的欄位用函數轉換成字串,然後和字串式的日期來進行比較,例如:【Select * From LoginTable Where To_Char(LoginTime,'yyyy.mm.dd hh24:mi:ss') >= '2003.03.01 00:00:00'】,這樣的寫法文法上沒有問題,但是效能上存在很大的隱患。因為,資料庫執行這樣的查詢是要對每一條記錄的loginTime欄位進行計算然後再比較,如果記錄數多,會很慢。