文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 707
阅读 4
收藏 0
点赞 0
评论 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
博文 2004
码字总数 14107
作品 0
深圳
程序员
获取、设置文件的时间

function CovFileDate(Fd:FileTime):TDateTime; { 转换文件的时间格式 } var   Tct:SystemTime;   Temp:FileTime; begin   FileTimeToLocalFileTime(Fd,Temp);   FileTimeToSystemT......

vga ⋅ 2015/02/15 ⋅ 0

IT关键词,面试知识问与答

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

桃子红了呐 ⋅ 2016/08/29 ⋅ 0

DOS命令大全

DOS命令大全 一)MD??建立子目录 1.功能:创建新的子目录 2.类型:内部命令 3.格式:MD[盘符:][路径名]〈子目录名〉 4.使用说明: (1)“盘符”:指定要建立子目录的磁盘驱动器字母,若...

Pracy ⋅ 2010/03/10 ⋅ 2

Winform开发框架之通用定时服务管理

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

walb呀 ⋅ 2017/12/04 ⋅ 0

zabbix邮件报警配置

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

独云 ⋅ 2017/08/18 ⋅ 0

MFT的文件名属性数据结构

在NTFS文件系统中,文件名属性的类型值是0x30。从这个属性名就可以知道文件名属性是用来存储文件名的,其实这个属性还可以存储文件的大小和时间等信息。在文件名属性中还记录这父目录的MFT索...

数据恢复v ⋅ 2016/07/12 ⋅ 0

Linux基础知识99问(三)

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

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

zabbix邮件报警

zabbix邮件报警 转载http://www.jb51.net/article/56973.htm,经过自己修改,修复文件部分有问题的地方。 二、安装邮件发送工具mailx yum install mailx dos2unix whereis mailx #查看安装路...

飞天啸妖 ⋅ 2017/07/14 ⋅ 0

Linux下的文本dos格式转Unix格式,去除^M符号

问:我在Windows中通过FTP传一个文本文件到Linux中,但是打开文本文件后每行最后都有^M的标志。由于很长,用编辑器去除太麻烦,有什么解决办法呢? 答:为了解决这个问题,Linux下专门有两个...

Adairs ⋅ 2015/06/11 ⋅ 0

win7 64位 汇编环境搭建(一)

最近在学习汇编与接口技术,但是在自己的机子上实验的时候,尴尬地发现我们的win 7 64位环境下,在DOS下竟然没有debug.exe,好不容易找到一个debu.exe,在DOS环境下调用,竟然是下面的结果:...

zhangwenwen ⋅ 2012/09/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vim介绍、vim颜色显示和移动光标、vim一般模式下移动光标、一般模式下复制粘贴剪切

VIM Vim 是 UNIX 文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff),语法高亮,全面的帮助系统,本地脚本(Vimscript),和便于选择的...

蛋黄Yolks ⋅ 14分钟前 ⋅ 0

springboot+mockito测试controller层遇到的问题

使用MockitoJUnitRunner测试的一个例子,原来报错无法找到bean, 类似的异常如下:createBeanError..... 原因:是因为@Runwith使用了SpringRunner,应该修改为MockitoJUnitRunner 代码如下: ...

writeademo ⋅ 26分钟前 ⋅ 0

关于“幂等”操作

一个幂等(idempotent)操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同. 开发中, 我们经常考虑幂等操作的场景有“接口调用”、“MQ消费”、“自动任务”等 接口调用, 可能出现...

零二一七 ⋅ 33分钟前 ⋅ 0

Dubbo服务服务暴露之ProxyFactory Invoker

Dubbo服务暴露过程中有涉及到调用ProxyFactory 中方法获取Invoker对象的过程,现在我们来深究下源码,来看下这个过程是在做些什么,返回的Invoker 对象是什么,我们来看一下代码的切入点: ...

哲别0 ⋅ 48分钟前 ⋅ 0

GP两种连接方式性能测试

GP两种连接方式性能测试 Pivotal import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class GPQueryStrin......

仔仔1993 ⋅ 52分钟前 ⋅ 0

jsonrpc-4j代码解析

解析文件 AutoJsonRpcServiceImplExporter JsonServiceExporter AutoJsonRpcServiceImplExporter 路径:com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter AutoJsonRpcServi......

郭恩洲_OSC博客 ⋅ 今天 ⋅ 0

百度搜索

from selenium import webdriver import time brower=webdriver.Firefox() brower.get('http://www.baidu.com') input=brower.find_element_by_id('kw') input.send_keys('中南大学') time.s......

南桥北木 ⋅ 今天 ⋅ 0

tomcat 日志记录器

1、日志记录器是记录消息的组件 日志记录器需要与某个servlet 容器相关联 2、Logger 接口 共定义了5种日志级别:FATAL、ERROR、WARNING、INFORMATION、DEBUGGER setVerbosity 设置级别 setC...

职业搬砖20年 ⋅ 今天 ⋅ 0

Thrift RPC实战(三) Thrift序列化机制

1.Thrift基础架构 Thrift是一个客户端和服务端的架构体系,数据通过socket传输; 具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports); 通过IDL脚本对传输数据的数据结构...

lemonLove ⋅ 今天 ⋅ 0

网站建设就要像2018世界杯的俄罗斯队大杀四方[图]

今天心情不错,因为昨天晚上观看了世界杯比赛,尤其是对俄罗斯队的大杀四方感到十分霸气侧漏啊,因此我联想到了自己的博客网站,我的博客是去年年底上线的,一直想建设一个关于读书和读后感作...

原创小博客 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部