background image

Delphi, C 语言, DOS 文件中的时间格式

Delphi 中的时间

Delphi 中的时间类型 TDateTime 实质是个 64

 

位 double 双精度浮点数,占 8 个

字节,其值为以 1899-12-30 00:00:00 为基准的时间,整数部分表示天数,小数
部分表示时间,1/86400 表示 1 秒(24*60*60)

语言中的时间

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 早