SystemTimeToFileTime、FileTimeToLocalFileTime、LocalFileTimeToFileTime三函数的跨平台实现
来源:互联网 发布:矩阵的秩的所有性质 编辑:程序博客网 时间:2024/06/05 16:19
// 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
请按任意键继续. . .
////////////////////////// 运行打印结束 /////////////////////////*/
//
#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
请按任意键继续. . .
////////////////////////// 运行打印结束 /////////////////////////*/
1 0
- SystemTimeToFileTime、FileTimeToLocalFileTime、LocalFileTimeToFileTime三函数的跨平台实现
- 跨平台 GUI 的三种实现策略.md
- 实现 Java 平台的三种方式
- 实现 Java 平台的三种方式
- 实现 Java 平台的三种方式
- 实现 Java 平台的三种方式
- 实现 Java 平台的三种方式
- 使用clock函数实现跨平台的精确计时
- .Net三种实现以及跨平台
- atoi函数不同平台的实现问题
- atoi函数不同平台的实现问题
- Symbian平台三种版本查找iapId的函数
- 跨平台的rand函数
- 一个基于socket的资源共享平台的实现(三)
- 快速开发平台的原理和实现(三)
- 用np++实现三大平台间文本的转换
- 专业语言:实现Java平台的三种方式
- SYSTEMTIME FileTimeToLocalFileTime 使用
- 深入Java集合学习系列:ArrayList的实现原理
- coj 1433 Defend the Bases
- 链表应用——按字母顺序存储并输出某目录下的子文件或子目录名
- java 删除重复文件
- 【原创】Tiny6410驱动模块的构建、加载和卸载
- SystemTimeToFileTime、FileTimeToLocalFileTime、LocalFileTimeToFileTime三函数的跨平台实现
- 整形与字符型之间的相互转换
- Hive权限之审计
- Linux下安装C++开发环境(G++/Eclipse)
- Modelsim仿真查看内部信号
- Linked List part2 : List class
- Mplayer的使用方法
- [leetcode] Max Points on a Line
- 21天学通Java学习笔记-Day09(IO流)