Object Pascal 学习笔记,Delphi 11 编程语言的完整介绍 作者: Marco Cantu 笔记:豆豆爸
2.5 日期和时间
早期版本的Pascal
语言中,没有原生的日期和时间类型,但是 Object Pascal
引入了一种原生的日期和时间类型,使用浮点表示来处理日期和时间信息。更确切地说,System 单元为此定义了一个特定的 TDateTime 数据类型。
这是一个浮点类型,因为它必须足够宽以在单个变量中存储年、月、日、小时、分钟和秒,精确到毫秒精度:
- 日期用自1899-12-30以来的天数表示,存储在 TDateTime 值的整数部分中,负值表示1899年之前的日期
- 时间以一天的分数形式存储在值的小数部分中
注解: 如果您想知道这个奇怪的日期从何而来,背后的故事相当长,与 Excel 和 Windows 应用程序中日期表示有关。当时的想法是将第 1 天视为 1900 年 1 月 1 日,这样 1899 年的除夕就是第 0 天。然而,该日期表示法的最初开发者却忘记了 1900 年不是闰年,因此后来把计算结果调整了 1 天,将 1900 年 1 月 1 日变成了第 2 天。1900 年 1 月 1 日变成了第 2 天。
正如签名提到的,TDateTime 不是编译器预定义类型,但是它在 System 单元中定义如下:
type
TDateTime = type Double;
注解: System 单元在某种程度上几乎可以被视为核心语言的一部分,因为它总是自动包含在每次编译中,而不需要uses语句(实际上,将 System 单元添加到uses部分会导致编译错误)。但从技术上讲,该单元是运行时库(RTL)的核心部分,将在第 17 章中介绍。
还有两种相关类型可以处理 TDateTime 结构中的时间和日期部分,分别定义为 TDate 和 TTime。这些特定类型是完整 TDateTime 类型的别名,但系统函数会对它们进行处理,修剪数据中未使用的部分。
使用日期和时间数据类型非常简单,因为 Delphi 包含了许多对该类型进行操作的函数。System.SysUtils 单元中有几个核心函数,还有许多相关函数在System.DateUtils 单元中(尽管名称不同,但也包括用于操作时间的函数)。
以下是一些常用的日期/时间操作函数的简短列表:
Now
:将当前日期和时间返回为日期/时间值。Date
:仅返回当前日期。Time
:仅返回当前时间。DateTimeToStr
:使用默认格式将日期和时间值转换为字符串;如果要对转换进行更多控制,请使用FormatDateTime
函数。DateToStr
:将日期/时间值的日期部分转换为字符串。TimeToStr
:将日期/时间值的时间部分转换为字符串。FormatDateTime
:使用指定的格式格式化日期和时间;通过提供复杂的格式字符串,您可以指定要查看的值以及要使用的格式。StrToDateTime
:将包含日期和时间信息的字符串转换为日期/时间值,如果字符串格式出错,则会引发异常。如果出现错误,其配套函数StrToDateTimeDef
会返回默认值,而不会引发异常。DayOfWeek
:返回与作为参数传递的日期/时间值的星期相对应的数字(使用区域设置配置)。DecodeDate
:从日期值中提取年、月和日的值。DecodeTime
:从日期值中提取小时、分钟、秒和毫秒。EncodeDate
:将年、月和日的值转换为日期/时间值。EncodeTime
:将小时、分钟、秒和毫秒值转换为日期/时间值。
为了向您展示如何使用这种数据类型以及相关的一些例程,我构建了一个简单的示例,名为 TimeNow
。当程序启动时,它会自动计算并显示当前的时间和日期。
var
StartTime: TDateTime;
begin
StartTime := Now;
Show('Time is ' + TimeToStr(StartTime));
Show('Date is ' + DateToStr(StartTime));
end;
第一条语句是对 Now
函数的调用,它返回当前的日期和时间。此值存储在 StartTime
变量中。
注解: 与 C 风格的语言不同,当使用 Object Pascal 函数没有参数时,无需键入空括号。
接下来的两条语句显示了 TDateTime
值的时间部分(转换为字符串)和相同值的日期部分。这就是程序的输出(取决于系统的区域设置配置):
Time is 6:33:14 PM
Date is 10/7/2020
要编译此程序,您需要引用 System.SysUtils 单元中的函数(“system utilities” 的简称)。除了调用 TimeToStr
和 DateToStr
之外,您还可以使用更强大的 FormatDateTime
函数。
请注意,时间和日期值会根据系统的国际设置转换成字符串。日期和时间格式化信息将根据操作系统和区域设置从系统中读取,并填充到 TFormatSettings
数据结构中。如果需要自定义格式,可以创建该类型的自定义结构,并将其作为参数传递给大多数日期时间格式化函数。
注解: TimeNow 项目还有第二个按钮,可以用来启用定时器(Timer)。计时器是一个组件,会自动执行事件处理程序(按照您指定间隔)。如果启用定时器,就会看到当前时间的每1秒都会添加到列表中。更有用的用户界面是每秒更新一个标签,显示当前时间,基本上就是建立了一个时钟。
2.5.1 日期时间辅助
为了更方便地操作 TDateTime 数据类型,Delphi 11
引入了一个特定的类型辅助,类似于我们在本章前面已经看到的本地数据类型。TDateTime
的记录助手名为 TDateTimeHelper
,定义在 System.DateUtils
单元中。可用的操作包括获取月份或年份的第一天,或转换为 Unix
日期格式,检查上午/下午,查找是否是闰年等等。记录辅助有150多个方法,在此不一一列举。
TDateTime
助手类型还引入了一个新的 NowUTC
操作(UTC 时区中的当前时间),经典 RTL 中没有这个操作。以下是一个示例代码片段,还显示了两个辅助调用的串联,Tomorrow
和 ToString
:
uses
DateUtils;
procedure TForm1.Button1Click(Sender: TObject);
begin
var MyDate: TDateTime := TDateTime.NowUTC;
MyDate.Tomorrow.ToString;
end;