64位时间戳获取以及显示的转化

本文介绍了一种用于将日期时间转换为64位时间戳的方法,并提供了将时间戳转回日期时间格式的函数实现。此外,还包含了一个获取当前时间戳的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

uint64_t transformToTimestamp(uint64_t year,
                              uint64_t month, uint64_t day,
                              uint64_t hour, uint64_t min,
                              uint64_t sec, uint64_t mil)
{
    uint64_t ret;

    static uint64_t daySum[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

    ret = ((year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) * 24 * 3600;

    ret += daySum[month - 1] * 24 * 3600;

    if (month > 2 && (((year & 3) == 0 && year % 100 != 0) || year % 400 == 0))
        ret += 24 * 3600;

    ret += ((day - 1) * 24 + hour) * 3600 + min * 60 + sec;

    return ret * 1000 + mil;
}

//获取时间戳函数
uint64_t get_timestamp()
{
    struct timeval curr_tv;
    time_t curr_secs;
    time_t curr_ms;
    struct tm curr_tm;

    // 获取Linux时间戳
    gettimeofday(&curr_tv, NULL);

    // timeval -> time_t
    curr_secs = curr_tv.tv_sec;
    curr_ms = curr_tv.tv_usec / 1000;

    // 日志文件需要的时间戳格式
    localtime_r(&curr_secs, &curr_tm);

    uint64_t startTime = transformToTimestamp(curr_tm.tm_year + 1900,
                                              curr_tm.tm_mon + 1,
                                              curr_tm.tm_mday,
                                              curr_tm.tm_hour,
                                              curr_tm.tm_min,
                                              curr_tm.tm_sec,
                                              curr_ms);
    return startTime;
}
/* 
将64位时间戳转化为时间数组 
*/  
void transformToDate(time64 timeStamp ,time64 **dateArry)
{  
    time64 low ,high ,mid ,t;  
    time64 year ,month ,day ,hour ,minute ,second ,milliSecond;  
    time64 daySum[] = {0 ,31 ,59 ,90 ,120 ,151 ,181 ,212 ,243 ,273 ,304 ,334 ,365};  
    time64 milOfDay = 24 * 3600 * 1000;  
    time64 milOfHour = 3600 * 1000;  
   
    /*防止超过9999-12-31 23:59:59:999*/  
    if(timeStamp > 315537897599999) {  
        timeStamp = 315537897599999;  
    }  
   
    low = 1;  
    high = 9999;  
   
    while(low <= high)  
    {  
        mid = (low+high)>>1;  
        t = ((mid-1) * 365 + (mid-1)/4 - (mid-1)/100 + (mid-1)/400) * milOfDay;  
   
        if(t == timeStamp)  
        {  
            low = mid + 1;  
            break;  
        }  
        else if(t < timeStamp)  
            low = mid + 1;  
        else  
            high = mid - 1;  
    }  
    year = low-1;  
    timeStamp -= ((year-1) * 365 + (year-1)/4 - (year-1)/100 + (year-1)/400) * milOfDay;  
   
    int isLeapYear = ((year&3) == 0 && year%100!=0) || year%400 == 0;  
   
    for(month = 1 ;(daySum[month] + ((isLeapYear && month > 1) ? 1 : 0)) * milOfDay <= timeStamp && month < 13 ;month ++) {  
        if(isLeapYear && month > 1)  
            ++daySum[month];  
    }  
    timeStamp -= daySum[month-1] * milOfDay;  
   
    day = timeStamp / milOfDay;  
    timeStamp -= day * milOfDay;  
   
    hour = timeStamp / milOfHour;  
    timeStamp -= hour * milOfHour;  
   
    minute = timeStamp / 60000;  
    timeStamp -= minute * 60000;  
   
    second = timeStamp / 1000;  
    milliSecond = timeStamp % 1000;  
   
    *dateArry[0] = year;  
    *dateArry[1] = month;  
    *dateArry[2] = day;  
    *dateArry[3] = hour;  
    *dateArry[4] = minute;  
    *dateArry[5] = second;  
    *dateArry[6] = milliSecond;  
}
//将64位时间戳转化为时间字符串
void transformToDateString(time64 timeStamp ,char *dateString)  
{  
    time64 year ,month ,day ,hour ,minute ,second ,milliSecond;  
    time64 *intp[] = {&year ,&month ,&day ,&hour ,&minute ,&second ,&milliSecond };  
   
    transformToDate(timeStamp ,intp);  
   
    sprintf(dateString ,"%.4d-%.2d-%.2d %.2d:%.2d:%.2d:%.3d" ,  
        year ,month ,day+1 ,hour ,minute ,second ,milliSecond );  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值