随笔 - 2146  文章 - 19 评论 - 11846 阅读 - 1267万

//相关函数:
SysUtils.FloatToDateTime();
SysUtils.TryFloatToDateTime();


在 System 单元定义有: TDateTime = type Double;

看来 TDateTime 是一个 8 字节 64 位数据, 不过是 Double 的别名.


{测试: TDateTime 就是一个 Double}
var
  t: TDateTime;
  d: Double;
  s: string;
begin
  t := EncodeDateTime(2009, 5, 22, 11, 22, 33, 999);

  {强制转换}
  d := Double(t);
  ShowMessage(FloatToStr(d)); //39955.4740046181

  {隐式转换}
  d := t;
  ShowMessage(FloatToStr(d)); //39955.4740046181

  {不必转换}
  ShowMessage(FloatToStr(t)); //39955.4740046181

  {直接把一个 Double 当作 TDateTime 看待}
  s := FormatDateTime('yyyy-m-d h:m:s:z', 39955.4740046181);
  ShowMessage(s);             //2009-5-22 11:22:33:999
end;


不会是任何一个 Double 都会转换成一个合法的时间, SysUtils 单元给出了最小与最大时间的常数:
const
  MinDateTime: TDateTime = -657434.0;      { 01/01/0100 12:00:00.000 AM }
  MaxDateTime: TDateTime =  2958465.99999; { 12/31/9999 11:59:59.999 PM }

保险起见, 应该通过: FloatToDateTime(); 或 TryFloatToDateTime(); 把一个数转换到 TDateTime;
反向转换就没必要用函数了.
{使用 TryFloatToDateTime}
var
  t: TDateTime;
  d: Double;
begin
  d := 0;
  if TryFloatToDateTime(d, t) then
    ShowMessage(DateTimeToStr(t)); //1899-12-30
end;

{使用 FloatToDateTime; 转换失败或遇到非法时间时会抛出异常}
var
  t: TDateTime;
  d: Double;
begin
  d := 0;
  t := FloatToDateTime(d);
  ShowMessage(DateTimeToStr(t)); //1899-12-30
end;

{当时间是 1899年12月30日 0时0分0秒 0毫秒时, TDateTime 对应的时间值是 0}
var
  d: Double;
  t: TDateTime;
begin
  t := StrToDateTime('1899-12-30 0:0:0:0');
  d := Double(t);
  ShowMessage(FloatToStr(d)); //0
end;

posted on   万一  阅读(6250)  评论(5编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2008-05-22 WinAPI: InvertRect - 翻转矩形中像素的颜色
2008-05-22 WinAPI: OffsetRect - 移动矩形
2008-05-22 WinAPI: IntersectRect、SubtractRect、UnionRect - 用两个矩形合成一个新的矩形
2008-05-22 我是怎样给 Delphi 代码着色的 - 回复 "sunhj " 的问题
2008-05-22 把文字输出到屏幕


点击右上角即可分享
微信分享提示