FILETIME或时间戳转换日期

FILETIME或时间戳转换日期文章目录一 FILETIME 或时间戳转换日期 以速度为前提

大家好,欢迎来到IT知识分享网。

一、FILETIME或时间戳转换日期

1:FILETIME转日期

// 闰年的判定方法: // ①、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年) // ②、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年) // ③、对于数值很大的年份,这年如果能整除3200,并且能整除则是闰年。如年是闰年,86400年不是闰年(因为虽然能整除3200,但不能整除) //返回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*;//北京时间是(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; } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/131309.html

(0)
上一篇 2025-08-08 19:45
下一篇 2025-08-08 20:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信