设为首页 加入收藏

TOP

SystemTimeToFileTime、FileTimeToLocalFileTime、LocalFileTimeToFileTime三函数的跨平台实现(一)
2015-07-24 05:40:46 来源: 作者: 【 】 浏览:9
Tags:SystemTimeToFileTime FileTimeToLocalFileTime LocalFileTimeToFileTime 三函数 跨平台 实现
// test.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include
#include
#include
#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
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->dwHighDa
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 3093 Margaritas on the Rive.. 下一篇二叉树三种遍历非递归算法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: