当前位置: 首页 > news >正文

(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 单元中定义如下:

typeTDateTime = 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。当程序启动时,它会自动计算并显示当前的时间和日期。

varStartTime: TDateTime;
beginStartTime := 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

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

相关文章:

  • 【Linux】Ubuntu安装搜狗中文输入法
  • 服务器硬件监控的重要性及监控方法(PIGOSS BSM )
  • 【办公类-21-02】20240118育婴员操作题word打印2.0
  • python实现图片式PDF转可搜索word文档[OCR](已打包exe文件)
  • 第6章 SpringBoot缓存管理
  • Linux练习题
  • 大数据导论(3)---大数据技术
  • Spark在降本增效中的一些思考
  • SpringMVC(八)处理AJAX请求
  • 冒泡排序-BubbleSort
  • spark+phoenix读取hbase
  • gin中间件篇
  • SAP ABAP SUBMIT常用用法
  • Spring Boot 4.0:构建云原生Java应用的前沿工具
  • 爬虫模板(附完整代码+案例)
  • 0x05 Python数据分析,Anaconda八斩刀
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • ES6 ...操作符
  • EventListener原理
  • Just for fun——迅速写完快速排序
  • Puppeteer:浏览器控制器
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring框架之我见(三)——IOC、AOP
  • 阿里研究院入选中国企业智库系统影响力榜
  • 阿里云购买磁盘后挂载
  • 读懂package.json -- 依赖管理
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 官方解决所有 npm 全局安装权限问题
  • 规范化安全开发 KOA 手脚架
  • 开源地图数据可视化库——mapnik
  • 面试总结JavaScript篇
  • 数据可视化之下发图实践
  • # Panda3d 碰撞检测系统介绍
  • #include到底该写在哪
  • (ZT)薛涌:谈贫说富
  • (阿里云万网)-域名注册购买实名流程
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)pulsar安装在独立的docker中,python测试
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net 调用php,php 调用.net com组件 --
  • .NET实现之(自动更新)
  • @GetMapping和@RequestMapping的区别
  • [ C++ ] STL---仿函数与priority_queue
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [Android]Tool-Systrace
  • [Angular 基础] - 指令(directives)
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具