• SystemTimeToFileTime、FileTimeToLocalFileTime、LocalFileTimeToFileTime三函数的跨平台实现


    // test.cpp : 定义控制台应用程序的入口点。
    //


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


    typedef struct 
    {
        int year;
        int month;
        int day;
    }S_DATE, *PS_DATE;


    bool IsLeafYear(int year)
    {
        if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) // 闰年的计算,归结起来就是通常说的:四年一闰;百年不闰,四百年再闰。 
        {
            return true; // 是闰年
        }
        else
        {
            return false; // 不是闰年
        }
    }


    bool IsValidDate(const S_DATE &date)
    {
        if(2 == date.month)
        {
            if(IsLeafYear(date.year))
            {
                if (date.day > 29 || date.day <= 0)
                {
                    return false;
                }
            }
            else
            {
                if (date.day > 28 || date.day <= 0)
                {
                    return false;
                }
            }
        }
        else if(4 == date.month || 6 == date.month || 9 == date.month || 11 == date.month)
        {
            if (date.day > 30 || date.day <= 0)
            {
                return false;
            }
        }
        else
        {
            if (date.day > 31 || date.day <= 0)
            {
                return false;
            }
        }
        return true;
    }


    int PassDay(const S_DATE &date) // 该年的第几天(包含闰年+1)
    {
        // 方法1:
        int day = date.day;
        int i;
        for(i = 1; i < date.month; i++)
        {
            if(2 == i)
            {
                if(IsLeafYear(date.year))
                {
                    day += 29;
                }
                else
                {
                    day += 28;
                }
            }
            else if(4 == i || 6 == i || 9 == i || 11 == i)
            {
                day += 30;
            }
            else
            {
                day += 31;
            }
        }
        return day;


        // 方法2:
        /*struct tm _tm;
        ::memset(&_tm, 0, sizeof(_tm));
        _tm.tm_year = date.year - 1900;
        _tm.tm_mon = date.month - 1;
        _tm.tm_mday = date.day;
        ::mktime(&_tm);
        return _tm.tm_yday;*/
    }
    #include <windef.h>
    void GetDayDiff(const S_DATE &date1, const S_DATE &date2, int &daydiff) // 获取两日期间相隔天数(date1为小日期,date2为大日期)
    {
        if(date1.year == date2.year)
        {
            daydiff = PassDay(date2) - PassDay(date1);
        }
        else if (date1.year > date2.year)
        {
            if (IsLeafYear(date2.year))
            {
                daydiff = PassDay(date1) + (366 - PassDay(date2));
            }
            else
            {
                daydiff = PassDay(date1) + (365 - PassDay(date2));
            }


            // 两日期年份相差大于一年的情况
            if (date1.year - date2.year > 1)
            {
                int i = date1.year - 1;
                for (; i > date2.year; i--)
                {
                    if (IsLeafYear(i))
                    {
                        daydiff += 366;
                    }
                    else
                    {
                        daydiff += 365;
                    }
                }
            }


            daydiff = -daydiff;
        }
        else
        {
            if (IsLeafYear(date1.year))
            {
                daydiff = PassDay(date2) + (366 - PassDay(date1));
            }
            else
            {
                daydiff = PassDay(date2) + (365 - PassDay(date1));
            }


            // 两日期年份相差大于一年的情况
            if (date2.year - date1.year > 1)
            {
                int i = date2.year - 1;
                for (; i > date1.year; i--)
                {
                    if (IsLeafYear(i))
                    {
                        daydiff += 366;
                    }
                    else
                    {
                        daydiff += 365;
                    }
                }
            }
        }
    }


    BOOL SystemTimeToFileTime2(__in CONST SYSTEMTIME *lpSystemTime, __out LPFILETIME lpFileTime)
    {
        if (NULL == lpSystemTime || NULL == lpFileTime)
            return FALSE;


        S_DATE date1 = {1601, 1, 1};
        S_DATE date2 = {lpSystemTime->wYear, lpSystemTime->wMonth, lpSystemTime->wDay};
        int nDiff = 0;
        GetDayDiff(date1, date2, nDiff);
        ULONGLONG ull = (ULONGLONG)nDiff * 24 * 60 * 60 * 1000 * 1000 * 10; // 单位为100ns
        ull += ((ULONGLONG)lpSystemTime->wHour * 60 * 60 * 1000 * 1000 * 10);
        ull += ((ULONGLONG)lpSystemTime->wMinute * 60 * 1000 * 1000 * 10);
        ull += ((ULONGLONG)lpSystemTime->wSecond * 1000 * 1000 * 10);
        ull += ((ULONGLONG)lpSystemTime->wMilliseconds * 1000 * 10);


        lpFileTime->dwHighDateTime = (ull & 0XFFFFFFFF00000000) >> 32;
        lpFileTime->dwLowDateTime = ull & 0X00000000FFFFFFFF;


        return TRUE;
    }


    BOOL FileTimeToLocalFileTime2(__in CONST FILETIME *lpFileTime, __out LPFILETIME lpLocalFileTime)
    {
        if (NULL == lpFileTime || NULL == lpLocalFileTime)
            return FALSE;


        // 获取时区
        time_t tt = 0;
        struct tm *ptm = NULL;
        tt = ::time(&tt);
        ptm = ::localtime(&tt);
        int nHourLocal = ptm->tm_hour;
        ptm = ::gmtime(&tt);
        int nHourUTC = ptm->tm_hour;
        int nTimeZoom = nHourLocal - nHourUTC;


        ULARGE_INTEGER uli = {lpFileTime->dwLowDateTime, lpFileTime->dwHighDateTime};
        uli.QuadPart += ((ULONGLONG)nTimeZoom * 60 * 60 * 1000 * 1000 * 10);
        lpLocalFileTime->dwLowDateTime = uli.LowPart;
        lpLocalFileTime->dwHighDateTime = uli.HighPart;


        return TRUE;
    }


    BOOL LocalFileTimeToFileTime2(__in CONST FILETIME *lpLocalFileTime, __out LPFILETIME lpFileTime)
    {
        if (NULL == lpLocalFileTime || NULL == lpFileTime)
            return FALSE;


        // 获取时区
        time_t tt = 0;
        struct tm *ptm = NULL;
        tt = ::time(&tt);
        ptm = ::localtime(&tt);
        int nHourLocal = ptm->tm_hour;
        ptm = ::gmtime(&tt);
        int nHourUTC = ptm->tm_hour;
        int nTimeZoom = nHourLocal - nHourUTC;


        ULARGE_INTEGER uli = {lpLocalFileTime->dwLowDateTime, lpLocalFileTime->dwHighDateTime};
        uli.QuadPart -= ((ULONGLONG)nTimeZoom * 60 * 60 * 1000 * 1000 * 10);
        lpFileTime->dwLowDateTime = uli.LowPart;
        lpFileTime->dwHighDateTime = uli.HighPart;


        return TRUE;
    }


    int main()
    {
        SYSTEMTIME      stLocal, stUTC;
        FILETIME        ftLocal, ftUTC, ftLocal2, ftUTC2;
        ULARGE_INTEGER  uliLocal, uliUTC, uliLocal2, uliUTC2;


        ::GetLocalTime(&stLocal); // 获取本地时间
        ::GetSystemTime(&stUTC); // 获取UTC时间
        printf("Local System Time: %d-%d-%d %d:%d:%d ", stLocal.wYear, stLocal.wMonth, 
            stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
        printf("UTC System Time  : %d-%d-%d %d:%d:%d ", stUTC.wYear, stUTC.wMonth, 
            stUTC.wDay, stUTC.wHour, stUTC.wMinute, stUTC.wSecond);


        SystemTimeToFileTime2(&stLocal, &ftLocal); // 本地时间转化成FILETIME结构
        SystemTimeToFileTime2(&stUTC, &ftUTC); // UTC时间转化成FILETIME结构
        uliLocal.LowPart = ftLocal.dwLowDateTime;
        uliLocal.HighPart = ftLocal.dwHighDateTime;
        uliUTC.LowPart = ftUTC.dwLowDateTime;
        uliUTC.HighPart = ftUTC.dwHighDateTime;
        printf("Local File Time  : %llu ", uliLocal.QuadPart);
        printf("UTC File Time    : %llu ", uliUTC.QuadPart);
        printf("Diff File Time   : %llu = 8*60*60*1000*1000*10(单位为100ns) ", uliLocal.QuadPart - uliUTC.QuadPart);


        FileTimeToLocalFileTime2(&ftUTC, &ftLocal2); // 将UTC的FILETIME时间转换为相应的本地的FILETIME时间。
        LocalFileTimeToFileTime2(&ftLocal, &ftUTC2); // 将本地的FILETIME时间转换为相应的UTC的FILETIME时间。
        uliLocal2.LowPart = ftLocal2.dwLowDateTime;
        uliLocal2.HighPart = ftLocal2.dwHighDateTime;
        uliUTC2.LowPart = ftUTC2.dwLowDateTime;
        uliUTC2.HighPart = ftUTC2.dwHighDateTime;
        printf("Local File Time from UTC File Time : %llu ", uliLocal2.QuadPart);
        printf("UTC File Time from Local File Time : %llu ", uliUTC2.QuadPart);


        system("pause");
        return EXIT_SUCCESS;
    }


    /*///////////////////////// 执行打印開始 //////////////////////////
    Local System Time: 2014-7-6 18:11:37
    UTC System Time  : 2014-7-6 10:11:37


    Local File Time  : 130491438974890000
    UTC File Time    : 130491150974890000
    Diff File Time   : 288000000000 = 8*60*60*1000*1000*10(单位为100ns)


    Local File Time from UTC File Time : 130491438974890000
    UTC File Time from Local File Time : 130491150974890000


    请按随意键继续. . .
    ////////////////////////// 执行打印结束 /////////////////////////*/
  • 相关阅读:
    JavaScript window对象属性和方法
    bzoj1878 [SDOI2009]HH的项链
    bzoj3289 Mato的文件管理
    bzoj2038 [2009国家集训队]小Z的袜子(hose)
    bzoj2333 [SCOI2011]棘手的操作
    bzoj2809 [Apio2012]dispatching
    hdu1512 Monkey King
    免费航班
    bzoj4538 [Hnoi2016]网络
    bzoj3207 花神的嘲讽计划Ⅰ
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/3872465.html
Copyright © 2020-2023  润新知