// 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\n", stLocal.wYear, stLocal.wMonth, 

        stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);

    printf("UTC System Time  : %d-%d-%d %d:%d:%d\n\n", 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\n", uliLocal.QuadPart);

    printf("UTC File Time    : %llu\n", uliUTC.QuadPart);

    printf("Diff File Time   : %llu = 8*60*60*1000*1000*10(单位为100ns)\n\n", 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\n", uliLocal2.QuadPart);

    printf("UTC File Time from Local File Time : %llu\n\n", 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





请按随意键继续. . .

////////////////////////// 执行打印结束 /////////////////////////*/

SystemTimeToFileTime、FileTimeToLocalFileTime、LocalFileTimeToFileTime三函数的跨平台实现的更多相关文章

  1. Windows获取时间函数(使用GetLocalTime,GetSystemTime,SystemTimeToTzSpecificLocalTime,GetFileTime API函数

    获取本地时间 typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; ...

  2. VC++时间函数总结

    目录 第1章基本概念    1 1.1 基本概念    1 1.2 时间表示法    2 第2章 Win32 API    3 2.1 获取    3 2.1.1 时间间隔    3 2.1.2 时刻 ...

  3. 跨平台的zip文件压缩处理,支持压缩解压文件夹

    根据minizip改写的模块,需要zlib支持 输出的接口: #define RG_ZIP_FILE_REPLACE 0 #define RG_ZIP_FILE_APPEND 1 //压缩文件夹目录, ...

  4. .NET Core 首例 Office 开源跨平台组件(NPOI Core)

    前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ...

  5. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  6. Mono为何能跨平台?聊聊CIL(MSIL)

    前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...

  7. TinyWeb v1.0 正式完成第一个Release版本(功能基于 libuv 跨平台库)

    使用方法很简单,很容易融入现有项目,使现有项目拥有Web网站功能和WebSocket,以及Socket直连! 并且包含了一个跨平台(windows/linux)工具集合; 嗯,也挺棒的^,^ 在项目中 ...

  8. 开源一个跨平台运行的服务插件 - TaskCore.MainForm

    本次将要很大家分享的是一个跨平台运行的服务插件 - TaskCore.MainForm,此框架是使用.netcore来写的,现在netcore已经支持很多系统平台运行了,所以将以前的Task.Main ...

  9. Xamarin+Prism开发详解一:PCL跨平台类库与Profile的关系

    在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]中提到过以下错误,不知道大伙还记得不: 无法安装程序包"Microsoft.Identity.Client 1.0. ...

随机推荐

  1. iBatis系列之三

    iBatis和Hibernate最大差别就是在于iBatis没有严格的和具体的表做关联:而是将结果集和DAO做关联. iBatis的SqlConfig.xml配置一个properties文件,其实可以 ...

  2. iOS 一些struct类型的NSLog输出格式-b

    我们经常会输出一些坐标尺寸信息之类的,比如view的frame,是CGRect类型的,用frame.oringial.x 和frame.size.width来做NSLog参数好麻烦,还好苹果对这些常用 ...

  3. Memcached(一)在Windows上安装和测试memcached

    1)下载memcached的windows安装程序 memcached-1.2.4-Win32-Preview-20080309_bin.zip 或其他版本 2)解压memcached  用管理员身份 ...

  4. JS身份证真实性校验(一)

    //这个可以验证15位和18位的身份证,并且包含生日和校验位的验证. //如果有兴趣,还可以加上身份证所在地的验证,就是前6位有些数字合法有些数字不合法. function isIdCardNo(nu ...

  5. C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?

    我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一 ...

  6. SELECT /*!40001 SQL_NO_CACHE */ * INTO OUTFILE '/tmp/ClientActionTrack2015112511.txt' 不堵塞事务

    mysql> insert into ClientActionTrack20151125(clientSn,ip,url,httpMethod,requestParams,requestHead ...

  7. BitMap 内存使用优化

    在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...

  8. CopyOnWriteArrayList与Collections.synchronizedList的性能对比

    列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ...

  9. Cookies和Session理论总结

    今天主要学习了Cookies和Session,网络上关于这方面的知识可谓很多,让人眼花缭乱,在此作一个小结.本文不讲多,不讲什么高大上的,只是抛出一块砖,讲三个问题:①什么是Cookies和Sessi ...

  10. 提高IIS的并发量

    IIS 7.0使用的是默认配置,服务器最多只能处理5000个同时请求. 根据相关文档调整设置,可以让服务器从设置上支持10万个同时请求 . 调整IIS 7应用程序池队列长度 由原来的默认1000改为6 ...