FILETIME或时间戳转换日期

一、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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值