Delphi 也用实型数表示日期和时间数据。但为了更准确起见,Delphi 特别定义了 TDateTime 数据类型,这是一个浮点类型,因为这个类型必须足够宽,使变量能容纳年、月、日、时、分和秒、甚至毫秒。日期值按天计数,从 1899-12-30 开始,放在 TDateTime 类型的整数部分;时间值则位于十进制数的小数部分。
TDateTime 不是编译器可直接识别的预定义类型,它在 System 单元定义:
type
TDateTime = type Double;
使用 TDateTime 类型很简单,因为 Delphi 为该类型定义了一系列操作函数,表3.3列出了这些函数。
表3.3: TDateTime 类型系统例程
例 程 | 作 用 |
Now | 返回当前日期及时间 |
Date | 返回当前日期 |
Time | 返回当前时间 |
DateTimeToStr | 按缺省格式将日期和时间值转换为字符串;特定格式转换可用FormatDateTime函数 |
DateTimeToString | 按缺省格式将日期和时间值拷贝到字符串缓冲区 |
DateToStr | 将TDateTime值的日期部分转为字符串 |
TimeToStr | 将TDateTime值的时间部分转为字符串 |
FormatDateTime | 按特定格式将日期和时间值转换为字符串 |
StrToDateTime | 将带有日期和时间信息的字符串转换为TdateTime类型值,如串有误将引发一个异常 |
StrToDate | 将带有日期信息的字符串转换为TDateTime类型格式 |
StrToTime | 将带有时间信息的字符串转换为TDateTime类型格式 |
DayOfWeek | 根据传递的日期参数计算该日期是一星期中的第几天 |
DecodeDate | 根据日期值返回年、月、日值 |
DecodeTime | 根据时间值返回时、分、秒、毫秒值 |
EncodeDate | 组合年、月、日值为TDateTime类型值 |
EncodeTime | 组合时、分、秒、毫秒值为TDateTime类型值 |
为了显示怎样使用日期时间类型及其相关例程,我建了一个简单的例子 TimeNow。该例子在主窗体中设置了一个按钮和一个列表框(ListBox)。开始执行时,程序自动计算并显示当前的时间及日期,以后每次单击按钮 ,显示从程序开始至当前的时间。
下面列出了窗体的 OnCreate 事件代码:
procedure TFormTimeNow.FormCreate(Sender: TObject);
begin
StartTime := Now;
ListBox1.Items.Add (TimeToStr (StartTime));
ListBox1.Items.Add (DateToStr (StartTime));
ListBox1.Items.Add ('Press button for elapsed time');
end;
第一句中调用了 Now 函数,这个函数返回当前的日期和时间,它的值保存在 StartTime 变量中,StartTime 变量是全程变量,其声明如下:
var
FormTimeNow: TFormTimeNow;
StartTime: TDateTime;
我只添加了第二个声明,第一个是由 Delphi 自动添加的。默认情况下的代码如下:
var
Form1: TForm1;
窗体名改变后,这个声明被自动更新。使用全程变量实际上不是最好的办法,更好的方法是使用窗体类的私有域,这涉及到面向对象的编程技术。
接下来的三个语句向位于窗体左面的列表框添加三个条目,结果见图3.3。列表框中的第一行显示了 TDateTime 值的时间部分字符串、第二行显示的是同一值的日期部分,最后一行显示了一个简单的提示。
图 3.3:例 TimeNow 启动时的输出显示
当用户单击 Elapsed 按钮时,上图第三行字符串被程序的计算结果代替:
procedure TFormTimeNow.ButtonElapsedClick(Sender: TObject);
var
StopTime: TDateTime;
begin
StopTime := Now;
ListBox1.Items [2] := FormatDateTime ('hh:nn:ss',
StopTime - StartTime);
end;
这串代码再次计算当前的时间,并显示当前与程序开始之时的时间差,其中用到了其它事件中的计算值,为此不得不把该值存入全程变量。实际上,最好是采用基于类的变量。
注意:上面代码中所用 ListBox 的索引号为 2,,而它代表的是第三行的显示输出,其原因是 listbox 的数据项是从零开始计数的:第一项计为 0,第二项为 1,第三项为 2,依次类推,后面涉及数组时再详细讨论这方面内容。
除了调用 TimeToStr 和 DateToStr 外,以上例子中还用到了功能强大的 FormatDateTime 函数(关于格式化参数详见 Delphi 帮助文件)。需要注意的是:当时间和日期转换成字符串时,其转换格式取决于 Windows 的系统设置。Delphi 从系统中读这些值,并把它们拷贝到 SysUtils 单元中声明的几个全程常量中,例如:
DateSeparator: Char;
ShortDateFormat: string;
LongDateFormat: string;
TimeSeparator: Char;
TimeAMString: string;
TimePMString: string;
ShortTimeFormat: string;
LongTimeFormat: string;
ShortMonthNames: array [1..12] of string;
LongMonthNames: array [1..12] of string;
ShortDayNames: array [1..7] of string;
LongDayNames: array [1..7] of string;
大部分全程常量与 currency 和浮点数格式化有关,在 Delphi 帮助的 Currency and date/time formatting variables 主题下,你可找到完整的清单。
注意:Delphi 中有一个 DateTimePicker 控件,它提供了选择日期的常用途径,即从一个日历中选择日期。