(delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)

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” 的简称)。除了调用 TimeToStrDateToStr之外,您还可以使用更强大的 FormatDateTime 函数。

​ 请注意,时间和日期值会根据系统的国际设置转换成字符串。日期和时间格式化信息将根据操作系统和区域设置从系统中读取,并填充到 TFormatSettings 数据结构中。如果需要自定义格式,可以创建该类型的自定义结构,并将其作为参数传递给大多数日期时间格式化函数。

注解: TimeNow 项目还有第二个按钮,可以用来启用定时器(Timer)。计时器是一个组件,会自动执行事件处理程序(按照您指定间隔)。如果启用定时器,就会看到当前时间的每1秒都会添加到列表中。更有用的用户界面是每秒更新一个标签,显示当前时间,基本上就是建立了一个时钟。

2.5.1 日期时间辅助

​ 为了更方便地操作 TDateTime 数据类型,Delphi 11 引入了一个特定的类型辅助,类似于我们在本章前面已经看到的本地数据类型。TDateTime 的记录助手名为 TDateTimeHelper,定义在 System.DateUtils 单元中。可用的操作包括获取月份或年份的第一天,或转换为 Unix 日期格式,检查上午/下午,查找是否是闰年等等。记录辅助有150多个方法,在此不一一列举。

TDateTime 助手类型还引入了一个新的 NowUTC 操作(UTC 时区中的当前时间),经典 RTL 中没有这个操作。以下是一个示例代码片段,还显示了两个辅助调用的串联,TomorrowToString

uses
  DateUtils;

procedure TForm1.Button1Click(Sender: TObject);
begin
  var MyDate: TDateTime := TDateTime.NowUTC;
  MyDate.Tomorrow.ToString;
end;

你可能感兴趣的:(Object,Pascal,Handbook,学习,笔记)