文档章节

时间与相关类型(3): TFileTime、TSystemTime 及 DOS 时间

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 707
阅读 4
收藏 0
//相关函数:
SysUtils.DateTimeToFileDate();
SysUtils.FileDateToDateTime();

SysUtils.DateTimeToSystemTime();
SysUtils.SystemTimeToDateTime();

Windows.SystemTimeToFileTime();
Windows.FileTimeToSystemTime();

Windows.FileTimeToDosDateTime();
Windows.DosDateTimeToFileTime();

Windows.FileTimeToLocalFileTime();
Windows.LocalFileTimeToFileTime();

Windows.GetLocalTime();

 
 
 
 
 

 

 

  

//TSystemTime 是系统定义的结构, 一看就是最方便实用的那种, 但要占 16 个字节:
TSystemTime = record
  wYear: Word;
  wMonth: Word;
  wDayOfWeek: Word;
  wDay: Word;
  wHour: Word;
  wMinute: Word;
  wSecond: Word;
  wMilliseconds: Word;
end;

//TFileTime 也是系统定义的结构, 同 TDateTime 一样大小, 但结构原理完全不同:
TFileTime = record
  dwLowDateTime: DWORD;
  dwHighDateTime: DWORD;
end;
TFileTime 记录的是从 1601-1-1 起的时间值, 以 100 纳秒(也就是万分之一毫秒)为单位

//DOS 时间就是一个 32 位(4字节)的整数(Integer), 好像没有专门的结构, 可用 LongRec 等代为解析.
DOS 时间的尺寸是 TFileTime、TDateTime 的 1/2, 是 TSystemTime 的 1/4; 因此不很精确.
它只能表示从 1980-2107 之间的时间, 且只能精确到 2 秒.

 
 
 
 
 

 

 

  

//下面几个函数一看就知道谁转换到谁:
SysUtils.DateTimeToSystemTime();
SysUtils.SystemTimeToDateTime();

Windows.SystemTimeToFileTime();
Windows.FileTimeToSystemTime();

Windows.FileTimeToDosDateTime();
Windows.DosDateTimeToFileTime();

//但并没有直接给 TFileTime 和 TDateTime 直接转换的函数;
//下面两个函数是 TDateTime 和 DOS 时间的转换; 文件的创建、修改、访问时间就是用这个 DOS 时间记录的.
SysUtils.DateTimeToFileDate();
SysUtils.FileDateToDateTime();

{转换到 DOS 时间的例子:}
var
  T: TDateTime;
  F,DosTime: Integer;
  FileTime: TFileTime;
  SystemTime: TSystemTime;
begin
  {构建一个 TDateTime, 并转换到 DOS 时间}
  T := EncodeDateTime(2009, 5, 22, 11, 22, 33, 999);
  F := DateTimeToFileDate(T);
  ShowMessage(IntToStr(F));  //985029328; 注意这个数很小, 下面会发现不精确

  {再从 DOS 时间转回 TDateTime}
  T := FileDateToDateTime(F);
  ShowMessage(FormatDateTime('yyyy-m-d h:m:s:zzz', T)); //2009-5-22 11:22:32:000; 只精确到 2 秒

  {TDateTime -> TSystemTime -> TFileTime -> DOS 时间}
  DateTimeToSystemTime(T, SystemTime);
  SystemTimeToFileTime(SystemTime, FileTime);
  FileTimeToDosDateTime(FileTime, LongRec(DosTime).Hi, longRec(DosTime).Lo);
  ShowMessage(IntToStr(SizeOf(SystemTime))); //985029328; 和上面得到的值一样
end;

 
 
 
 
 

 

 

  

DateTimeToFileDate 转换出的时间不是 TFileTime, 而是 Dos 时间或叫文件时间;
譬如我们用 FileAge 函数返回的文件最后修改的时间(一个 Integer)就是个 Dos 时间.
{读取记事本程序最后被修改的时间}
var
  DosTime: Integer;
  FileTime: TFileTime;
  SysTime: TSystemTime;
  DateTime: TDateTime;
  str: string;
begin
  DosTime := FileAge('C:\Windows\System32\Notepad.exe');
  ShowMessage(IntToStr(DosTime)); //948804037; 这是读取结果

  {转换为可以理解的格式}
  DosDateTimeToFileTime(LongRec(DosTime).Hi, LongRec(DosTime).Lo, FileTime);
  FileTimeToSystemTime(FileTime, SysTime);
  str := Format('%d年%d月%d日 %d:%d:%d', [SysTime.wYear, SysTime.wMonth,
    SysTime.wDay, SysTime.wHour, SysTime.wMinute, SysTime.wSecond]);
  ShowMessage(str); //2008年4月13日 19:14:10

  {如果仅仅是要这个时间, 可以这样}
  FileAge('C:\Windows\System32\Notepad.exe', DateTime);
  ShowMessage(DateTimeToStr(DateTime)); //2008-4-13 19:14:10
end;

 
 
 
 
 

 

 

  

又是我们可能只需要一个 TSystemTime 格式的时间, 没必要转来转去, 可以直接用 GetLocalTime 函数获取:
var
  SysTime: TSystemTime;
  DT1, DT2: TDateTime;
begin
  GetLocalTime(SysTime);
  DT1 := SystemTimeToDateTime(SysTime);

  DT2 := Now;

  {这两个时间显示应该是一样的}
  ShowMessage(DateTimeToStr(DT1));
  ShowMessage(DateTimeToStr(DT2));
end;

 
 
 
 
 

 

 

  

另外 FileTimeToLocalFileTime 和 LocalFileTimeToFileTime 是本地时间和 UTC(国际标准计时) 的转换;
用 API 函数获取的 TFileTime 时间都是 UTC 格式的, 需要转换使用.

DateUtils-Function

本文转载自:http://www.cnblogs.com/del/archive/2009/05/22/1487368.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
全国青少年信息学奥林匹克分区联赛(NOIP)竞赛大纲

(#表示普及组不涉及) 一、初赛内容与要求 (一)计算机的基本常识 诞生与发展 特点 在现代社会中的应用 计算机系统的基本组成 计算机的工作原理# 计算机中的数的表示 计算机信息安全基础知...

海天一树X
11/06
0
0
Winform开发框架之通用定时服务管理

做项目的时候,或多或少需要和其他外部系统或者接口进行数据交互,有些是单向的获取,有些可能是修改状态后再写回去,不管如何,这个都可以称之为数据同步操作,如人员信息同步、业务数据同步...

walb呀
2017/12/04
0
0
IT关键词,面试知识问与答

二叉树遍历的三种方式? php中单引号和双引号有什么区别? 时序图 1.什么是时序图 2.如何看懂时序图 3.时序图的作用 4.如何绘制时序图 分布式 一个业务分拆多个子业务,部署在不同的服务器上。...

桃子红了呐
2016/08/29
0
0
zabbix邮件报警配置

1. 安装mailx 服务 通过mailx 配置好外部SMTP服务器相关信息发送邮件(这里是配置发信的地址): yum -yinstallmailx vim /etc/mail.rc增加以下内容: setbsdcompatsetfrom=test@163.com smt...

独云
2017/08/18
0
0
Linux基础知识99问(三)

三、 走进Linux殿堂:35问   20.安装Linux,对硬件有什么要求?   Linux对硬件要求很低,可以运行在386以上CPU,8M以上内存的IBM PC机上。但由于设备厂商的支持力度不够,所以Linux倒是对...

疯狂的小黑
2016/10/13
7
0

没有更多内容

加载失败,请刷新页面

加载更多

给女朋友讲解什么是Optional【JDK 8特性】

前言 只有光头才能变强 前两天带女朋友去图书馆了,随手就给她来了一本《与孩子一起学编程》的书,于是今天就给女朋友讲解一下什么是Optional类。 至于她能不能看懂,那肯定是看不懂的。(学到...

Java3y
12分钟前
0
0
2019年六大新兴信息安全方向

导读 黑客攻击和网络犯罪的威胁正在不断升级,相应的技术“军备竞赛”正愈演愈烈,对于信息安全从业人员来说,掌握最新的信息安全工具,是在信息安全战争中生存下来的关键所在。 从特朗普的手...

问题终结者
19分钟前
0
0
redis扩展-自定义PropertyPlaceholderConfigurer,在spring属性注入之前,手动将properteis合并到spring容器中

背景:spring容器启动过程中,通过PropertyPlaceholderConfigurer读取properties配置文件,并将properties配置文件中的值注入spring bean的属性中, PropertyPlaceholderConfigurer使用方式多...

燃犀
20分钟前
0
0
PostgreSQL SPI 中的错误处理

PostgreSQL SPI 用于在 C 或是其他编程语言编写的扩展函数(存储过程)中调用数据库本身的解析器、规划器和执行器的功能,以及对 SQL 语句进行执行。 在最重要的一个函数 SPI_execute 的文档...

helloclia
21分钟前
0
0
深入理解Java内存模型

1 内存模型产生背景 在介绍Java内存模型之前,我们先了解一下物理计算机中的并发问题,理解这些问题可以搞清楚内存模型产生的背景。物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物...

小刀爱编程
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部