您的位置:首页 > 其它

Windows中的时间(SYSTEMTIME和FILETIME) .

2011-10-08 22:31 337 查看
 上一篇中介绍了C运行库中的时间处理函数。这一篇介绍Windows SDk中提供的时间函数。两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC实现),同样提供本地时间和UTC时间之间的转换。不过CRT中的tm时间在SDK中对应为系统时间(SYSTEMTIME),CRT中的time_t时间在SDK中对应的为文件时间(FILETIME),那个"特殊时刻"也变成1601年1月1日的子夜。
    当然,首先要弄清楚FILETIME与SYSTEMTIME定义。

   

view plaincopy to clipboardprint?

typedef struct _FILETIME {  
                          DWORD dwLowDateTime;  
                          DWORD dwHighDateTime;  
} FILETIME, *PFILETIME;  
typedef struct _SYSTEMTIME {  
                            WORD wYear;  
                            WORD wMonth;  
                            WORD wDayOfWeek;  
                            WORD wDay;  
                            WORD wHour;  
                            WORD wMinute;  
                            WORD wSecond;  
                            WORD wMilliseconds;  
} SYSTEMTIME, *PSYSTEMTIME;  

view plaincopy to clipboardprint?

void GetSystemTime(  
                   LPSYSTEMTIME lpSystemTime);  
void GetLocalTime(  
                  LPSYSTEMTIME lpSystemTime);  

void GetSystemTime(
LPSYSTEMTIME lpSystemTime);
void GetLocalTime(
LPSYSTEMTIME lpSystemTime);


    这两个函数获得SYSTEMTIME形式的当前时间,不过GetSystemTime函数获得当前的UTC时间,GetLocalTime获得当前的本地时间,可以想象,获得的两个时间存在着时差。类似于CRT中提供tm与time_t之间的转换,SDK也提供了两个函数来转换SYSTEMTIME时间与FILETIME时间。

   

view plaincopy to clipboardprint?

BOOL SystemTimeToFileTime(  
                          const SYSTEMTIME* lpSystemTime,  
                          LPFILETIME lpFileTime);  
BOOL FileTimeToSystemTime(  
                          const FILETIME* lpFileTime,  
                          LPSYSTEMTIME lpSystemTime);  

view plaincopy to clipboardprint?

BOOL LocalFileTimeToFileTime(  
                             const FILETIME* lpLocalFileTime,  
                             LPFILETIME lpFileTime);  
BOOL FileTimeToLocalFileTime(  
                             const FILETIME* lpFileTime,  
                             LPFILETIME lpLocalFileTime);  

BOOL LocalFileTimeToFileTime(
const FILETIME* lpLocalFileTime,
LPFILETIME lpFileTime);
BOOL FileTimeToLocalFileTime(
const FILETIME* lpFileTime,
LPFILETIME lpLocalFileTime);


    LocalFileTimeToFileTime函数将本地的FILETIME时间转换为对应的UTC的FILETIME时间。我觉得,这个函数只是通过将本地时间减去与UTC时间的时间差来实现转换,比如在东八区的本地时间转换为对应的UTC时间,只需要将本地时间减去8*60*60*1000*1000*10(单位100ns)。类似,FileTimeToLocalFileTime函数是将UTC时间转换为本地时间,它只是将减去时间差换成加上时间差。

    了解了这些功能,让我们用代码说话吧。

   

view plaincopy to clipboardprint?

#include <stdlib.h>   
#include <stdio.h>   
#include <time.h>
  
#include <windows.h>   
  
  
int main()  
{  
    SYSTEMTIME      stLocal, stUTC, stUTC2;  
    FILETIME        ftLocal, ftUTC, ft;  
    ULARGE_INTEGER  uli;  
  
    GetLocalTime(&stLocal);  
    GetSystemTime(&stUTC);  
    printf("Local System Time(YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stLocal.wYear, stLocal.wMonth,  
        stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);  
    printf("UTC System Time  (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC.wYear, stUTC.wMonth,  
        stUTC.wDay, stUTC.wHour, stUTC.wMinute, stUTC.wSecond);  
  
    SystemTimeToFileTime(&stLocal, &ftLocal);  
    uli.LowPart = ftLocal.dwLowDateTime;  
    uli.HighPart = ftLocal.dwHighDateTime;  
    printf("Local File Time: %llu/n", uli.QuadPart);  
  
    LocalFileTimeToFileTime(&ftLocal, &ftUTC);  
    uli.LowPart = ftUTC.dwLowDateTime;  
    uli.HighPart = ftUTC.dwHighDateTime;  
    printf("UTC File Time: %llu/n", uli.QuadPart);  
  
    FileTimeToSystemTime(&ftUTC, &stUTC2);  
    printf("UTC System Time2 (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC2.wYear, stUTC2.wMonth,  
        stUTC2.wDay, stUTC2.wHour, stUTC2.wMinute, stUTC2.wSecond);  
  
    return EXIT_SUCCESS;  
}  

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <windows.h>

int main()
{
SYSTEMTIME stLocal, stUTC, stUTC2;
FILETIME ftLocal, ftUTC, ft;
ULARGE_INTEGER uli;

GetLocalTime(&stLocal);
GetSystemTime(&stUTC);
printf("Local System Time(YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stLocal.wYear, stLocal.wMonth,
stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
printf("UTC System Time (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC.wYear, stUTC.wMonth,
stUTC.wDay, stUTC.wHour, stUTC.wMinute, stUTC.wSecond);

SystemTimeToFileTime(&stLocal, &ftLocal);
uli.LowPart = ftLocal.dwLowDateTime;
uli.HighPart = ftLocal.dwHighDateTime;
printf("Local File Time: %llu/n", uli.QuadPart);

LocalFileTimeToFileTime(&ftLocal, &ftUTC);
uli.LowPart = ftUTC.dwLowDateTime;
uli.HighPart = ftUTC.dwHighDateTime;
printf("UTC File Time: %llu/n", uli.QuadPart);

FileTimeToSystemTime(&ftUTC, &stUTC2);
printf("UTC System Time2 (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC2.wYear, stUTC2.wMonth,
stUTC2.wDay, stUTC2.wHour, stUTC2.wMinute, stUTC2.wSecond);

return EXIT_SUCCESS;
}

    程序输出结果如下:

   


    代码13行GetLocalTime函数获得当前的本地SYSTEMTIME时间,14行获得对应的UTC的SYSTEMTIME时间,如输出结果前两行所显示,两者相差8小时(凌晨还在写博客,表扬下自己。。。)。

    20行SystemTimeToFileTime函数将本地SYSTEMTIME时间转换为方便计算的本地FILETIME形式时间,如输出结果第三行所显示。

    25行LocalFileTimeToFileTime函数将本地FileTime时间转换为对应的UTC的FILETIME时间,如输出结果第四行所显示。就像前面介绍的,如果你将输出结果第三,四两行所显示的数字相减,并除以10*1000*1000*60*60,你将会得出8,你可以算下试试,记住FILETIME是以100纳秒为单位的。

    最后30行FileTimeToSystemTime将FILETIME时间转换为SYSTEMTIME时间。可以看出输出结果中第五行与第二行相同,这是必须的,因为两者都是当前本地时间对应的UTC时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐