文章目录
一、FILETIME或时间戳转换日期
编程语言用的Qt /c++
代码如下(示例):
1:FILETIME转日期
// 闰年的判定方法:
// ①、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)
// ②、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
// ③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年(因为虽然能整除3200,但不能整除172800)
//返回TRUE为闰年
// static bool ISLeapYear(quint32 year)
// {
// return (year % 400 == 0) ? true : ((year % 4 == 0 && year % 100 != 0) ? true : false);
// }
/*
* 1:FILETIME转日期
* FILETIME:结构持有的64位无符号的文件的日期和时间值。此值表示自UTC(Coordinated Universal Time)时间1601年1月1日开始的100纳秒为单位的时间。
* 协调世界时间(UTC)UTC是根据原子钟来计算时间,现在世界上最精确的原子钟50亿年才会误差1秒,可以说非常精确。
* 平年全年有365天,闰年全年有366天,因为闰年的二月有29天,而平年的二月只有28天
* 闰年共有366天(1-12月分别为31天,29天,31天,30天,31天,30天,31天,31天,30天,31天,30天,31天)。
* 平年共有365天(1-12月分别为31天,28天,31天,30天,31天,30天,31天,31天,30天,31天,30天,31天)。
*/
QByteArray GlobalFunction::FILETIMEToDateTime(quint64 FILETIME)
{
FILETIME += 8*36000000000;//北京时间是(UTC+08:00:00:00:00:00:00)
quint32 _ns = 1; //纳秒--最小单位100ns
quint32 _us = 10*_ns;//微秒
quint32 _ms = 1000*_us;//毫秒
quint64 _second = 1000*_ms;//秒
quint64 _minute = 60*_second;//分
quint64 _hour = 60*_minute;//时
quint64 _day = 24*_hour;//日
int leapMonth[12] = {31,29,31,30,31,30,31,31,30,31,30,31};//闰年月份
int commonMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//平年月份
quint32 yearStart = 1601;//保存年份
quint16 month=0;//保存月份
quint16 day=0;//保存日数
quint16 hour=0;//保存小时
quint16 minute=0;//保存分钟
quint16 second=0;//保存秒数
quint16 ms=0;//保存毫秒数
quint16 us=0;//保存微秒数
quint16 ns=0;//保存纳秒数
quint32 allDayCount = 0;
bool LeapOrCommon ;//保存是平年FALSE还是闰年TRUE
qint64 tempDayCount = FILETIME / _day; //获取日数
hour = (FILETIME % _day)/_hour; //获取小时
minute = ((FILETIME % _day) % _hour) / _minute; //获取分钟
second = (((FILETIME % _day) % _hour) % _minute) /_second ; //获取秒
ms = ((((FILETIME % _day) % _hour) % _minute) % _second) / _ms; //获取毫秒
us = (((((FILETIME % _day) % _hour) % _minute) % _second) % _ms) / _us; //获取微秒
ns = ((((((FILETIME % _day) % _hour) % _minute) % _second) % _ms) % _us) / _ns; //获取纳秒
//获取年份
for(;;)
{
qint64 day = (yearStart % 400 == 0) ? 366 : ((yearStart % 4 == 0 && yearStart % 100 != 0) ? 366 : 365);//判断是否闰年 = 366,平年 = 355
allDayCount += day;
if(allDayCount > tempDayCount)
{
tempDayCount = tempDayCount + day + 1 - allDayCount;//剩余的日数
LeapOrCommon = (day == 366) ? true : false;
break;
}
yearStart++;
}
//获取月份和日数
for(int i=0;i<12;++i)
{
if(LeapOrCommon)
tempDayCount -= leapMonth[i];
else
tempDayCount -= commonMonth[i];
if(tempDayCount<1)
{
month = i+1;
if(LeapOrCommon)
day = tempDayCount + leapMonth[i];
else
day = tempDayCount + commonMonth[i];
break;
}
}
QByteArray array;
//年
array.append(QByteArray::number(yearStart));
array.append('-');
//月
array.append(QByteArray::number(month));
array.append('-');
//日
array.append(QByteArray::number(day));
array.append(' ');
//时
array.append(QByteArray::number(hour));
array.append(':');
//分
array.append(QByteArray::number(minute));
array.append(':');
//秒
array.append(QByteArray::number(second));
array.append('.');
//毫秒
array.append(QByteArray::number(ms));
array.append('.');
//微秒
array.append(QByteArray::number(us));
array.append('.');
//纳秒
array.append(QByteArray::number(ns));
return array;
}
2:时间戳转日期
/* 2:时间戳转日期
* 时间戳是通常是一个字符序列,唯一地标识某一刻的时间。数字时间戳技术是数字签名技术一种变种的应用。
* 时间戳具体指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
* 格林威治时间(GWT)
* 格林威治子午线上的地方时,位于伦敦郊区的皇家格林尼治天文台的标准时间,也叫世界时。比如我们中国是东八区,北京时间是(GMT+08:00)
*/
QString GlobalFunction::TimestampToDateTime(quint32 Timestamp)
{
Timestamp += 8*3600;//北京时间是(GMT+08:00)
quint32 _second = 1;//秒
quint32 _minute = 60*_second;//分
quint32 _hour = 60*_minute;//时
quint32 _day = 24*_hour;//日
int leapMonth[12] = {31,29,31,30,31,30,31,31,30,31,30,31};//闰年月份
int commonMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//平年月份
quint32 yearStart = 1970;//保存年份
quint16 month=0;//保存月份
quint16 day=0;//保存日数
quint16 hour=0;//保存小时
quint16 minute=0;//保存分钟
quint16 second=0;//保存秒数
quint32 allDayCount = 0;
bool LeapOrCommon ;//保存是平年FALSE还是闰年TRUE
qint64 tempDayCount = Timestamp / _day; //获取日数
hour = (Timestamp % _day)/_hour; //获取小时
minute = ((Timestamp % _day) % _hour) / _minute; //获取分钟
second = (((Timestamp % _day) % _hour) % _minute) /_second ; //获取秒
//获取年份
for(;;)
{
qint64 day = (yearStart % 400 == 0) ? 366 : ((yearStart % 4 == 0 && yearStart % 100 != 0) ? 366 : 365);//判断是否闰年 = 366,平年 = 355
allDayCount += day;
if(allDayCount > tempDayCount)
{
tempDayCount = tempDayCount + day + 1 - allDayCount;//剩余的日数
LeapOrCommon = (day == 366) ? true : false;
break;
}
yearStart++;
}
//获取月份和日数
for(int i=0;i<12;++i)
{
if(LeapOrCommon)
tempDayCount -= leapMonth[i];
else
tempDayCount -= commonMonth[i];
if(tempDayCount<1)
{
month = i+1;
if(LeapOrCommon)
day = tempDayCount + leapMonth[i];
else
day = tempDayCount + commonMonth[i];
break;
}
}
QByteArray array;
//年
array.append(QByteArray::number(yearStart));
array.append('-');
//月
array.append(QByteArray::number(month));
array.append('-');
//日
array.append(QByteArray::number(day));
array.append(' ');
//时
array.append(QByteArray::number(hour));
array.append(':');
//分
array.append(QByteArray::number(minute));
array.append(':');
//秒
array.append(QByteArray::number(second));
return array;
}