最近在做关于数据同步更新的编程,就接触到了FILETIME 这个结构
FILETIME 结构表示自 1601 年 1 月 1 日以来的 100 纳秒为间隔数。
结构包含组合在一起形成一个 64 位值的两个 32 位值。
typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME;
请注意 FILETIME 结构基于 100 纳秒为时间间隔。
最好使用文件的时间时,定义下列符号。
例如:
#define _SECOND ((int64) 10000000) #define _MINUTE (60 * _SECOND) #define _HOUR (60 * _MINUTE) #define _DAY (24 * _HOUR)
执行 Arithmetics 文件时间
另外,往往有必要对文件的时间执行简单的算术运算。
例如,您可能需要知道文件后 30 天。
文件时间执行算术运算,您需要将 FILETIME 转换为 quadword (64 位整数),执行算术运算,然后将结果转换回 FILETIME。
假定包含文件的创建时间的 FILETIME 结构英尺,则下面的代码示例添加到时间 30 天:
假定包含文件的创建时间的 FILETIME 结构英尺,则下面的代码示例添加到时间 30 天:
ULONGLONG qwResult; // Copy the time into a quadword. qwResult = (((ULONGLONG) ft.dwHighDateTime) << 32) + ft.dwLowDateTime; // Add 30 days. qwResult += 30 * _DAY; // Copy the result back into the FILETIME structure. ft.dwLowDateTime = (DWORD) (qwResult & 0xFFFFFFFF ); ft.dwHighDateTime = (DWORD) (qwResult >> 32 );
设置文件时间
您可以通过使用 SetFileTime() 函数来设置文件的文件时间。
BOOL SetFileTime( HANDLE hFile, // Handle to the file. CONST FILETIME *lpCreationTime, // Time the file was created. CONST FILETIME *lpLastAccessTime, // Time the file was last accessed. CONST FILETIME *lpLastWriteTime // Time the file was last // written to. );
此函数,可以修改创建、 上次访问,以及上次写入时间,而不更改文件的内容。
若要使用此功能,必须打开的文件有句柄。
此文件句柄可以从调用 CreateFile() 或 OpenFile()。
以 GENERIC_WRITE 访问权限,必须打开该文件。
在设置文件时间之后,应释放通过调用 CloseHandle() 的文件句柄。
假定 szFilename 是一个有效的文件名和英尺 FILETIME 结构,下面的代码示例将该文件的创建日期设置为英尺中包含的时间:
假定 szFilename 是一个有效的文件名和英尺 FILETIME 结构,下面的代码示例将该文件的创建日期设置为英尺中包含的时间:
BOOL bResult; HANDLE hFile = CreateFile( szFilename, GENERIC_WRITE, // The file must be opened with write access. FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); if (hFile != INVALID_HANDLE_VALUE) { bResult = SetFileTime( hFile, &ft, NULL, NULL ); CloseHandle(hFile); }
显示文件的时间
文件时间基于协调通用时间 (UTC)。
在英国格林威治标准,基于 UTC 时间松散定义为当前日期和时间。
您很可能希望显示文件时间相对于本地时间 (即,日期和您所在时区的时间)。
若要执行此操作,可以使用下列 FileTimeToLocalFileTime():
BOOL FileTimeToLocalFileTime( CONST FILETIME *lpFileTime, // Pointer to UTC file time to convert. LPFILETIME lpLocalFileTime // Pointer to converted file time. );
请注意此函数使用的当前设置所在的时区与夏时制。
因此,如果它是夏时制,此函数将考虑夏时制,即使您要转换的时间是标准时间。
以有意义的方式显示文件时,首先需要将其转换为系统时间,使用 FileTimeToSystemTime(),如下所示:
以有意义的方式显示文件时,首先需要将其转换为系统时间,使用 FileTimeToSystemTime(),如下所示:
BOOL FileTimeToSystemTime( CONST FILETIME *lpFileTime, // Pointer to file time to convert. LPSYSTEMTIME lpSystemTime // Pointer to structure to receive ); // system time.
系统结构表示的日期和时间使用单个成员的月、 日、 年、 工作日、 小时、 分钟、 秒和毫秒。
最好也符合选定系统的当前区域设置的格式显示日期和时间。 要做到这一点使用 GetDateFormat() 和 GetTimeFormat(),如下所示:
最好也符合选定系统的当前区域设置的格式显示日期和时间。 要做到这一点使用 GetDateFormat() 和 GetTimeFormat(),如下所示:
int GetDateFormat( LCID Locale, // Locale for which date is to be formatted. DWORD dwFlags, // Flags specifying function options. CONST SYSTEMTIME *lpDate, // Date to be formatted. LPCTSTR lpFormat, // Date format string. LPTSTR lpDateStr, // Buffer for storing formatted string. int cchDate // Size of buffer. ); int GetTimeFormat( LCID Locale, // Locale for which time is to be formatted. DWORD dwFlags, // Flags specifying function options. CONST SYSTEMTIME *lpTime, // Time to be formatted. LPCTSTR lpFormat, // Time format string. LPTSTR lpTimeStr, // Buffer for storing formatted string. int cchTime // Size of buffer. );
通过将 LOCALE_USER_DEFAULT 作为第一个参数传递给这些函数,告诉他们设置传递的日期/时间格式的默认格式根据当前区域设置。
在这种情况下,您可以将 NULL 传递 lpFormat 参数。
下面的代码示例假定包含 UTC 值的 FILETIME 结构英尺,打印存储在英尺的日期:
下面的代码示例假定包含 UTC 值的 FILETIME 结构英尺,打印存储在英尺的日期:
SYSTEMTIME st; char szLocalDate[255], szLocalTime[255]; FileTimeToLocalFileTime( &ft, &ft ); FileTimeToSystemTime( &ft, &st ); GetDateFormat( LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szLocalDate, 255 ); GetTimeFormat( LOCALE_USER_DEFAULT, 0, &st, NULL, szLocalTime, 255 ); printf( "%s %s\n", szLocalDate, szLocalTime );