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\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三函数的跨平台实现的更多相关文章
- Windows获取时间函数(使用GetLocalTime,GetSystemTime,SystemTimeToTzSpecificLocalTime,GetFileTime API函数
		获取本地时间 typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; ... 
- VC++时间函数总结
		目录 第1章基本概念 1 1.1 基本概念 1 1.2 时间表示法 2 第2章 Win32 API 3 2.1 获取 3 2.1.1 时间间隔 3 2.1.2 时刻 ... 
- 跨平台的zip文件压缩处理,支持压缩解压文件夹
		根据minizip改写的模块,需要zlib支持 输出的接口: #define RG_ZIP_FILE_REPLACE 0 #define RG_ZIP_FILE_APPEND 1 //压缩文件夹目录, ... 
- .NET Core 首例 Office 开源跨平台组件(NPOI Core)
		前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ... 
- dotNET跨平台相关文档整理
		一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ... 
- Mono为何能跨平台?聊聊CIL(MSIL)
		前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ... 
- TinyWeb v1.0 正式完成第一个Release版本(功能基于 libuv 跨平台库)
		使用方法很简单,很容易融入现有项目,使现有项目拥有Web网站功能和WebSocket,以及Socket直连! 并且包含了一个跨平台(windows/linux)工具集合; 嗯,也挺棒的^,^ 在项目中 ... 
- 开源一个跨平台运行的服务插件 - TaskCore.MainForm
		本次将要很大家分享的是一个跨平台运行的服务插件 - TaskCore.MainForm,此框架是使用.netcore来写的,现在netcore已经支持很多系统平台运行了,所以将以前的Task.Main ... 
- Xamarin+Prism开发详解一:PCL跨平台类库与Profile的关系
		在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]中提到过以下错误,不知道大伙还记得不: 无法安装程序包"Microsoft.Identity.Client 1.0. ... 
随机推荐
- NET SqlClient
			NET SqlClient的使用与常见问题 阅读目录 一.简介 二.使用ADO.NET 三.常见问题 回到目录 一.简介 在很多要求性能的项目中,我们都要使用传统的ADO.NET的方式来完成我们日常的 ... 
- html+css篇
			一,html语义话标签 http://www.html5jscss.com/html5-semantics-section.html 
- 用Cornerstone配置SVN
			iOS 用CornerStone配置SVN,HTTP及svn简单使用说明 分类: iOS / OC2014-11-11 11:19 3149人阅读 评论(0) 收藏 举报 目录(?)[+] 转 ... 
- bzoj 2806: [Ctsc2012]Cheat 后缀自动机DP
			2806: [Ctsc2012]Cheat Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 583 Solved: 330[Submit][Statu ... 
- IronPython脚本调用C#dll示例
			上篇Python脚本调用C#代码数据交互示例(hello world)介绍了与C#紧密结合的示例,这里还将提供一个与C#结合更紧密的示例,直接调用C#编写的DLL. 我们还是沿用了上篇文章的 ... 
- Sectong日志分析
			http://tech.uc.cn/?p=2866#comments http://blog.sectong.com/blog/hw_bigdata.html 
- 李洪强iOS开发Swift篇—06_流程控制
			李洪强iOS开发Swift篇—06_流程控制 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注 ... 
- (转载)Linux系统调用及用户编程接口(API)
			(转载)http://www.farsight.com.cn/news/emb167.htm 1 Linux系统调用 所谓系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组 ... 
- 彻底卸载oracle10g
			如果Oracle安装在Windows上,那么删除起来特别麻烦,以下列出具体步骤: 软件环境: Windows 7.ORACLE 10.1.24:ORACLE安装路径为:C:/ORACLE 实现方法: ... 
- HDU-3790 最短路径问题
			最短路径问题 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ... 
