Delphi, C语言, DOS文件中的时间格式及转换
Delphi中的时间
Delphi中的时间类型TDateTime实质是个64位 double 双精度浮点数,占8个字节,其值为以1899-12-30 00:00:00为基准的时间,整数部分表示天数,小数部分表示时间,1/86400表示1秒(24*60*60)
C语言中时间
C语言中时间类型time_t实质是个32位 long 长整形数,占4个字节,其值为以1970-1-1 00:00:00为基准的秒数,就是所谓的日历时间,不过这个格式有个大问题,2^31/365/24/60/60=68.096,只能表示1970年前后68年的时间,也就是说这个日历到2038年就到头了,好吧,据说世界末日是2012年……
DOS文件中的时间
DOS文件中的时间就有意思了,微软刚开发DOS那会儿存储空间还金贵得很,一切都以省字当头,所以那时用的FAT12/FAT16文件系统还是8.3文件名,就是文件名占8个字节,扩展名占3个字节,我们现在在DOS下查看Program Files文件夹时还能看到它的短文件名形式Progra~1。文件名都这么省那时间呢?DOS文件中的时间也占4个字节32位,其中高2字节表示日期,低2字节表示时间,表示日期的2字节中高7位表示从1980年起的年份,中间4位表示月,剩下的低5位表示日。表示时间的2字节中高5位表示小时,中间6位表示分钟,剩下低5位表示秒。
等等,用5位表示秒?2^5=32,不够60秒啊!所以这5位其实是秒数的高5位,最低位偷偷补了个0,也就是说那时的DOS文件系统分不出2秒钟以内建立文件的先后,好在DOS下时间只显示到分,要不一看文件时间的秒数清一色偶数,那不露馅了。
再说下这DOS时间的年数,2^7=128,从1980年起最多就到2107年,这也就是为什么有当年闹得沸沸扬扬的千年虫问题了,好在现在的FAT32,NTFS早已解决这问题了。
Delphi和C语言时间的转换
1899-12-30到1970-1-1之间相隔25569天,知道这个转换就简单了
//C语言时间:int32格式,1970-1-1 00:00:00为起点秒数
//Delphi时间:Double格式,1899-12-30 00:00:00为起点天数
//2.75: 1900-1-1 18:00
function CTimeToTime(t: LongInt): TDateTime;
begin
Result := t / 86400 + 25569;
end;
function TimeToCTime(t: TDateTime): LongInt;
begin
Result := Round((t - 25569) * 86400);
end;
Delphi 和 DOS文件时间的转换
Delphi中提供了现成的转换函数
//DOS文件时间转换为Delphi时间
function FileDateToDateTime(FileDate: Integer): TDateTime;
//Delphi时间转换为DOS文件时间
function DateTimeToFileDate(DateTime: TDateTime): Integer;
评论