zoukankan      html  css  js  c++  java
  • Windows中的时间(SYSTEMTIME和FILETIME) (转载)

    转载:http://blog.csdn.net/bokee/article/details/5330791

    两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC实现),同样提供本地时间和UTC时间之间的转换。不过CRT中的tm时间在SDK中对应为系统时间(SYSTEMTIME),CRT中的time_t时间在SDK中对应的为文件时间(FILETIME),那个"特殊时刻"也变成1601年1月1日的子夜。

    当然,首先要弄清楚FILETIME与SYSTEMTIME定义。

    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;

    比较一下,很明显,FILETIME与time_t类似,是64位整型,不过FILETIME是以100纳秒(ns)为单位。SYSTEMTIME与tm类似,不过多了一项wMilliseconds。可以看出,SDK时间比CRT的时间提供了更高的精度。同时SDK提供了更丰富的函数来处理时间。

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

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

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

    函数命名很self-explanatory,就不用多说了吧。

    SDK还提供了两个很有趣的函数。

    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时间转换为本地时间,它只是将减去时间差换成加上时间差。

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

    #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时间。

     2.文件修改时间

    转载:https://www.xuebuyuan.com/541894.html

    CString GetModifyTime(CString appname)
    {
        WIN32_FIND_DATA ffd ;
        HANDLE hFind = FindFirstFile(appname,&ffd);
        SYSTEMTIME stUTC, stLocal;
        FileTimeToSystemTime(&(ffd.ftLastWriteTime), &stUTC);
        SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
    
        CString strTmp;
        strTmp.Format("%d-%d-%d,%d:%d", stLocal.wYear,stLocal.wMonth,stLocal.wDay,stLocal.wHour,stLocal.wMinute);
    }
  • 相关阅读:
    二分查找思路以及可能出现情况对应解决办法
    多线程知识点大纲
    服务器consul启动方法
    大白话带你认识 ZooKeeper !重要概念一网打尽!
    「Netty实战 02」手把手教你实现自己的第一个 Netty 应用!新手也能搞懂!
    从 BIO、NIO 聊到 Netty,最后还要实现个 RPC 框架!
    什么是P问题、NP问题和NPC问题
    期刊汇总
    Typora 使用
    TCA 复习
  • 原文地址:https://www.cnblogs.com/chechen/p/7059637.html
Copyright © 2011-2022 走看看