Delphi 彻底搞懂 Unix/Linux 时间格式及平台间转换

news/2024/5/13 20:45:08/文章来源:https://blog.csdn.net/sensor_WU/article/details/130008747

目录

一、TDateTime 时间格式

二、Unix/Linux的日期和时间格式

三、Delphi中操作Unix/Linux格式的日期和时间

1.  TDateTime 转 Unix/Linux格式

2. Unix/Linux格式 转 TDateTime

3. 与腾讯、阿里等平台(简称:平台)时间转换

四、Delphi实现13位Unix/Linux格式时间函数

1.  DateTimeToUnix13

2.  UnixToDateTime13    

附录、Windows 11 时区设置

1.  在右下角时间上右键单击,选择【调整日期和时间】

 2. 选择调整时区


一、TDateTime 时间格式 

        在Delphi中,表示时间用TDateTime类型,围绕TDateTime有很多相关的处理时间的函数,例如:获取当前时间的函数:now

        TDateTime声明为double类型,含有日期-时间值。TDateTime值的整体部分是自1899年12月30日以来已经过去的天数。TDateTime值的小数部分是一天中的时间。TDateTime值支持的最大的正确日期被限制在12/31/9999 23:59:59:999。所有超过这个日期的值都会在大多数用TDateTime值操作的例程中引起错误和异常。

        TDateTime也支持负值。应该小心使用负的TDateTime值。不正确地使用负值会导致各种问题。

        下表显示了TDateTime值的例子和它们相应的日期和时间: 

ValueDescription(24H)
01899-12-30 12:00:00
2.751900-01-01 18:00:00
-1.251899-12-29 06:00:00 
350651966-01-01 12:00:00

        DateUtils单元有几个API(如DaysBetween、HoursBetween、WeeksBetween等),它们是计算两个TDateTime之间的时间的更好的API,这些API无论底层的双数是负数还是正数都能工作。

        当处理负的TDateTime值时,计算必须单独处理时间部分。小数部分反映了24小时内的时间,而不考虑TDateTime值的符号。例如,1899年12月29日上午6点是-1.25,而不是-1+0.25,这等于-0.75。大于-1.0到0.0的日期,和小于1.0到0.0的日期,是相互映照的(是同一天)。这是因为+0和-0是相等的。

二、Unix/Linux的日期和时间格式

        在Delphi中,Unix的日期和时间值被编码为1970年1月1日开始的午夜后的秒数。但是在其他的语言或者系统中(例如javascript语言),Unix的日期和时间值也被编码为1970年1月1日开始的午夜后的毫秒数

  1. 如果是秒数,则表示出的是一个10位整数,例如:1680864084 表示的是 2023-04-07 18:41:24
  2. 如果是毫秒数,则表示出的是一个13位的整数,因为1秒是1000毫秒。例如:1680864084583 表示的是 2023-04-07 18:41:24 583 (注意:后面多了3位数字583就表示的是583毫秒)。

三、Delphi中操作Unix/Linux格式的日期和时间

1.  TDateTime 转 Unix/Linux格式

        使用函数DateTimeToUnix(位于System.DateUtils单元中),调用DateTimeToUnix将一个TDateTime值转换为相同日期和时间的相应Unix/Linux编码。

//函数原型
function DateTimeToUnix(const AValue: TDateTime; AInputIsUTC: Boolean): Int64;

特别注意:

        参数 AInputIsUTC 表示需要转换的 AValue 是不是UTC时间,默认值是True,表示是。具体UTC时间是什么,网上可以查询到,简单的理解就当时GMT+0时间,但是对于我们国家,我们一般使用的是GMT+8时间。这样就产生一个问题,AInputIsUTC不同的值,返回的结果将不一样!

        对于Delphi中的now函数(返回当前时间),已经按照操作系统的时区调整了,也就是说表示的是操作系统选择的时区的时间。

例如:

        T  :=  2023-04-08 1:19:53(TDateTime )

序号函数结果说明
1DateTimeToUnix(T)1680916793UTC时间
2DateTimeToUnix(T,False)1680887993当前时区时间(北京时间)

        以上结果相差8个小时!

2. Unix/Linux格式 转 TDateTime

        使用函数UnixToDateTime(位于System.DateUtils单元中),调用UnixToDateTime将一个Unix/Linux编码值转换为相同日期和时间的相应TDateTime格式。

//函数原型
function UnixToDateTime(const AValue: Int64; AReturnUTC: Boolean): TDateTime;

特别注意:

        参数AReturnUTC表示是否返回UTC时间,默认是True,如果需要返回当前时区时间,请将其设置位False。

例如:

        T  := 1680916793(Unix/Linux格式10位数字时间)

序号函数结果说明
1UnixToDateTime(T)2023-04-08 1:19:53UTC时间
2UnixToDateTime(T,False)2023-04-08 9:19:53当前时区时间(北京时间)

        以上结果相差8个小时!

3. 与腾讯、阿里等平台(简称:平台)时间转换

        如果以上说明还不是很明白,那么简单来说,如果需要和平台有时间签名的需求,一般平台要求的时间是Unix/Linux格式的UTC时间(GMT+0)。

        Delphi用 now 函数取得当前时间,需要转换成平台要求的Unix/Linux格式时间,一定使用DateTimeToUnix(T,False)函数,也就是说一定要加参数False,否则Delphi会认为参数T就是UTC时间。很多开发的朋友只知道相差8个小时,但并不知道原因。

        当平台返回一个Unix/Linux格式时间,我们需要在Delphi中使用,就一定要用UnixToDateTime(T,False)函数,也就是说一定要加参数False。这样转换过来的就是我们需要的当地时间(北京时间)。

        有些朋友开发时,知道相差8个小时,然后通过IncHour(System.DateUtils单元中)函数增加或者减少8个小时,也达到了目的。实际上Delphi已经提供了参数控制是UTC时间还是当地时间。

        因为平台要面对的是全球所有时区,所不能使用当地时间,只能使用UTC时间,因为UTC时间是一个,大家都是统一的!

四、Delphi实现13位Unix/Linux格式时间函数

        Delphi官方只提供了10位精确到秒的转换函数,有时候我们也需要13位精确到毫秒的转换函数,下面两个函数精确到毫秒。

1.  DateTimeToUnix13

function DateTimeToUnix13(const AValue: TDateTime; AInputIsUTC: Boolean = True): Int64;
varLDate: TDateTime;beginif AInputIsUTC thenLDate := AValueelseLDate := TTimeZone.Local.ToUniversalTime(AValue);Result := MilliSecondsBetween(UnixDateDelta, LDate);if LDate < UnixDateDelta then  //{UnixDateDelta = $63E1,1970-01-01}Result := -Result;end;

2.  UnixToDateTime13    

function UnixToDateTime13(const AValue: Int64; AReturnUTC: Boolean = True): TDateTime;
beginif AReturnUTC thenResult := IncMilliSecond(UnixDateDelta, AValue)elseResult := TTimeZone.Local.ToLocalTime(IncMilliSecond(UnixDateDelta, AValue));
end;

  

附录、Windows 11 时区设置

1.  在右下角时间上右键单击,选择【调整日期和时间】

 2. 选择调整时区

 

以上为自己学习总结,如果能帮到大家就开心了,如果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_283433.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

秋招笔试知识点

1、计算出结构体大小&#xff08;对齐规则&#xff09; struct st { char name; int age; double money; }s; 规则&#xff08;字节对齐&#xff09; 1、 char 从0开始&#xff0c;0是任何数字的整数倍 int 是4个字节&#xff0c;4开始 double 是8个字节&#xff0c;从8开…

人人开源快速搭建后台(踩过的大坑,已解决)

目录 一、renrenfast后端代码导入idea后pom文件中的plugins报错 二、后端yaml配置出现问题 三、启动后端出现404 四、在vscode终端上运行 npm 会询问 “你要如何打开这个文件“ 五、npm install失败 一、renrenfast后端代码导入idea后pom文件中的plugins报错 亲测有效 谷…

ToBeWritten之汽车信息安全威胁建模

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

itop-3568开发板驱动学习笔记(9)高级字符设备(三)信号驱动 IO

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录应用层信号机制应用层开启异步通知驱动层异步通知接口实验代码信号驱动 IO 不需要像 poll 一样查询设备的状态&#xff0c;一旦设备有目标事件发生&#xff0c;就会触发 SIGIO 信号&#xff0c;然后处理信号…

Eyeshot .NET 2023.1 Crack

概述 Eyeshot 是.NET 的 CAD 控件。它本身支持Windows Forms和Windows Presentation Foundation。它随附四个不同的Visual Studio工具箱项目&#xff1a;用于 2D 和 3D 几何创建或编辑的设计、用于自动生成 2D 视图的 绘图、使用线性静态分析进行几何验证的模拟以及用于CNC刀具…

MySQL学习笔记(十八)—— 事务基本知识

1. 数据库事务概述 存储引擎支持请况 SHOW ENGINES; # 命令来查看当前 MySQL 支持的存储引擎都有哪些&#xff0c;以及这些存储引擎是否支持事务。能看出在 MySQL 中&#xff0c;只有InnoDB 是支持事务的。 基本概念 事务&#xff1a;一组逻辑操作单元&#xff0c;使数据从一…

4.8 Beijing Rust Meetup | Call For Presenters

如果你有兴趣参与探讨Rust作为一种强调性能、安全和并发性的编程语言的各种应用、实践和无限可能性的头脑风暴&#xff0c;就一定不能错过这场来自达坦科技、南京大学、CloudWeGo、华为等技术专家带来的关于Rust编程语言相关应用的线下Meetup。我们的主题是Rust &#x1f4a1;X…

stable diffusion成为生产力工具(一):制作购物车图标icon

S&#xff1a;你安装stable diffusion就是为了看小姐姐么&#xff1f; I &#xff1a;当然不是&#xff0c;当然是为了公司的发展谋出路~~ 预先学习&#xff1a; 安装webui《Windows安装Stable Diffusion WebUI及问题解决记录》。运行使用时问题《Windows使用Stable Diffusion时…

nodejs微服务:微服务集群

搭建Grpc微服务集群 某单一的微服务&#xff0c;比如&#xff1a;micro_a, 部署在一台机器上挂掉后, 不管是微服务机器挂掉还是consul_client挂掉&#xff0c;都会导致整个微服务不可访问&#xff0c;这时候我们就需要进行微服务的集群也就是 micro_a 的微服务不能部署到一台机…

基于html+css的盒子旋转

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Java多线程编程—wait/notify机制

文章目录1. 不使用wait/notify机制通信的缺点2. 什么是wait/notify机制3. wait/notify机制原理4. wait/notify方法的基本用法5. 线程状态的切换6. interrupt()遇到方法wait()7. notify/notifyAll方法8. wait(long)介绍9. 生产者/消费者模式10. 管道机制11. 利用wait/notify实现…

Bert的MLM任务loss原理

bert预训练有MLM和NSP两个任务&#xff0c;其中MLM是类似于“完形填空”的方式&#xff0c;对一个句子里的15%的词进行mask&#xff0c;通过双向transformerfeedforwardrediual_addlayer_norm完成对每个词的embedding编码&#xff0c;然后对mask的这个词进行预测&#xff0c;预…

【记录Bug】IDEA提示“Error:java: 错误: 不支持发行版本 17”

项目场景&#xff1a; 开发工具&#xff1a;IDea 后端框架&#xff1a;SpringBoot 问题描述 在rebuild或运行项目时提示“Error:java: 错误: 不支持发行版本 17”。 这个错误表明你的IDEA版本不支持使用Java 17。你需要将项目编译运行环境设置为更低版本的Java&#xff0c;或…

总结MySQL、Redis的优化措施与使用 mysql_upgrade升级数据结构

目录 一.MySQL数据库优化 二.Redis优化 三.MySQL创建测试账号报错 一.MySQL数据库优化 遵循MySQL层优化的五个原则: 减少数据访问&#xff0c;返回更少的数据&#xff0c;减少交互次数减少服务器CPU开销&#xff0c;利用更多资源。理解SQL优化原理并进行SQL优化&#xff0c…

力扣:字符串中的第一个唯一字符(C++实现)

题目部分&#xff1a; 解题思路&#xff1a; 方案一&#xff1a; 首先认真审题的小伙伴们一定会发现就是题目给了提示只包含小写字母&#xff0c;也就是说我们的排查范围是小写的26个字母。为了怕有的友友们一时短路想不起来&#xff0c;我就其按照顺序列出来吧。 即&#x…

[架构之路-157]-《软考-系统分析师》- 9-信息系统规划-2-少量人力进行项目初步调研(系统分析师的首要任务)与可行性研究报告

目录 9 . 3 初步调查 1. 初步调查的目标 9.4可行性研究 9.4.1可行性评价准则 1 . 经济可行性&#xff08;钱的可行性&#xff09; 2 . 技术可行性&#xff08;能力可行性&#xff09; 3 . 法律可行性&#xff08;社会&#xff09; 4 . 用户使用可行性&#xff08;用户&…

洛谷P2822:组合数问题 ←(帕斯卡法则+取模+前缀和)

【题目来源】https://www.luogu.com.cn/problem/P2822【题目描述】 组合数​表示的是从n个物品中选出m个物品的方案数。举个例子&#xff1a;从(1,2,3)三个物品中选择两个物品可以有(1,2)&#xff0c;(1,3)&#xff0c;(2,3) 这三种选择方法。根据组合数的定义&#xff0c;我们…

属性配置的宏(修改宏IntDir)

项目属性页码 拷贝下 常见宏列表 下表描述了可用宏的常用子集&#xff1b;还有很多没有在这里列出。 转到“宏”对话框&#xff0c;查看项目中的所有属性及其当前值。 有关如何创建 MSBuild 属性定义以及如何在 .props、.targets 和 .vcxproj 文件中将其用作宏的详细信息&am…

面向对象编程(进阶)7:面向对象特征三:多态性

一千个读者眼中有一千个哈姆雷特。 目录 7.1 多态的形式和体现 7.1.1 对象的多态性 举例&#xff1a; 7.1.2 多态的理解 7.1.3 举例 1、方法内局部变量的赋值体现多态 2、方法的形参声明体现多态 3、方法返回值类型体现多态 7.2 为什么需要多态性(polymorphism)&#x…

登录认证功能的实现

1.登录校验分析 什么是登录校验&#xff1f; 所谓登录校验&#xff0c;指的是我们在服务器端接收到浏览器发送过来的请求之后&#xff0c;首先我们要对请求进行校验。先要校验一下用户登录了没有&#xff0c;如果用户已经登录了&#xff0c;就直接执行对应的业务操作就可以了…