FILETIME 结构

最近在做关于数据同步更新的编程,就接触到了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 天:
   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 结构,下面的代码示例将该文件的创建日期设置为英尺中包含的时间:
   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(),如下所示:
   BOOL FileTimeToSystemTime(
     CONST FILETIME *lpFileTime, // Pointer to file time to convert.
     LPSYSTEMTIME lpSystemTime   // Pointer to structure to receive
   );                            // system time.
				
系统结构表示的日期和时间使用单个成员的月、 日、 年、 工作日、 小时、 分钟、 秒和毫秒。

最好也符合选定系统的当前区域设置的格式显示日期和时间。 要做到这一点使用 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 结构英尺,打印存储在英尺的日期:
   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 );
				
 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值