日期和时间

2019-01-14

日期和时间


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 控件,它提供了选择日期的常用途径,即从一个日历中选择日期。


阅读97