查MSDN可以看到,windows中的时间分为以下几类:
Format | Type | Description |
System | Year, month, day, hour, second, and millisecond, taken from the internal hardware clock. | |
Local | A system time or file time converted to the system's local time zone. | |
File | The number of 100-nanosecond intervals since January 1, 1601. | |
MS-DOS | WORD | A packed word for the date, another for the time. |
Windows | DWORD orULONGLONG | The number of milliseconds since the system was last started. When retrieved as a DWORD value, Windows time cycles every 49.7 days. |
Interrupt Count | ULONGLONG | The number of 100-nanosecond intervals since the system was last started. |
下面来看看SYSTEMTIME 和FILETIME这两个构造体。
typedef struct _SYSTEMTIME {
WORD wYear; // [1601, 30827]
WORD wMonth; // [1, 12] = [January, December]
WORD wDayOfWeek; // [0, 6] = [Sunday, Monday, …, Saturday]
WORD wDay; // [1, 31]
WORD wHour; // [0, 23]
WORD wMinute; // [0, 59]
WORD wSecond; // [0, 59]
WORD wMilliseconds; // [0, 999]
} SYSTEMTIME, *PSYSTEMTIME;
这个结构体只是用来存放时间的,具体里面存什么时间,取决于时间是从哪个API获取的。
涉及到这个结构体的API有:
API | 作用 |
取得SYSTEMTIME格式的本地时间。 | |
取得SYSTEMTIME格式的UTC时间。 | |
设定SYSTEMTIME格式的本地时间。 | |
设定SYSTEMTIME格式的UTC时间。 |
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
这个结构体说白了,就是用两个DWORD存了一个很大的数用来表示时间。
这个数是从1601年1月1日起到存放的时间为止,有多少个100纳秒间隔。
涉及到这个结构体的API有:
API | 作用 |
比较两个FILETIME时间。 | |
检索一个文件或目录的创建,上次访问,和最后修改的日期和时间。 | |
设定一个文件或目录的创建,上次访问,和最后修改的日期和时间。 | |
将一个UTC的文件时间转换为本地的文件时间。 | |
本地文件时间转换到UTC文件时间。 |
这里需要说明的是GetFileTime,SetFileTime 操作的是UTC时间。
可以做个实验: 假如我在东八区,现在本地时间是11:40AM 1、GetSystemTime 得到3:40AM(UTC时间) 2、SystemTimeToFileTime 将3:40AM(UTC时间)转化为FILETIME 3、SetFileTime 将3:40AM(UTC时间)设定到文件属性。 4、用windows的资源管理器查看刚才设定的文件,时间是11:40AM。 |
也就是说,文件属性中的存放的创建时间,上次访问时间,最后修改时间都是UTC时间,
只不过用windows的资源管理器查看时,该程序根据当前系统设定的时区,重新计算后显示了。
验证这一点也很简单,将系统时区改为东七区,查看刚才的文件,现在文件的时间变为10:40AM了。
了解了这一点,大家可以考虑下面的2个问题该怎么做呢?
问题1:如何将一个SYSTEMTIME格式的本地时间设定到一个文件的属性中?
答案:
1、SystemTimeToFileTime 将SYSTEMTIME格式的本地时间转化为FILETIME格式的本地时间
2、LocalFileTimeToFileTime 本地文件时间转换到UTC文件时间。
3、SetFileTime 设定文件时间。
问题2:如何像资源管理器那样,显示文件的本地时间。
答案:
1、GetFileTime 取得UTC格式的文件时间
2、FileTimeToLocalFileTime 将UTC格式的文件时间转化为本地文件时间
3、FileTimeToSystemTime 将本地文件时间转化为SYSTEMTIME格式的时间。
还有两个API是用来转化SYSTEMTIME 和FILETIME这两个构造体的。
API | 作用 |
将一个FILETIME格式的时间转化为SYSTEMTIME格式的UTC时间。 | |
将一个SYSTEMTIME格式的UTC时间转化为FILETIME格式的时间。 |