• 实现系统函数time,获取当前时间与UTC的间隔


    因种种原因,最近很少上cnblogs了。刚写了一个实现time的函数,可以通过该函数获取当前时间与1970年1月1日 0时0分0秒的差值,精确到秒,可以用在某些没有时候使用time不正确而不得不调用硬件时钟的场合。把其中HWCLOCK打开即可,关闭的话使用的是date获取的系统时间。其中打开时是应用在PPC架构的嵌入式linux上,具体源码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef unsigned short YEAR;
    typedef unsigned short MONTH;
    typedef unsigned short DAY;
    typedef unsigned short HOUR;
    typedef unsigned short MIN;
    typedef unsigned short SEC;
    
    char g_month[12][4] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
    
    #define HWCLOCK
    
    
    typedef struct struct_time
    {
        YEAR    year;
        MONTH    mon;
        DAY        day;
        HOUR    hour;
        MIN        min;
        SEC        sec;
    }time_s;
    
    void PrintTimeStruct(time_s *t)
    {
        if(t)
            printf("%d-%d-%d %d:%d:%d
    ",t->year,t->mon,t->day,t->hour,t->min,t->sec);
    
    }
    
    void FillInElem(time_s *t,char *buf,int index)
    {
        int i = 0;
        
        switch(index)
        {
            //week
            case 1:
                {                
                    break;
                }
            //month
            case 2:
                {
                    for(i = 0 ; i < 12 ; i++)
                    {
                        if(strcasecmp(buf,g_month[i]) == 0)
                        {
                            t->mon = i+1;
                            break;
                        }
                    }
                    break;
                }
            //day    
            case 3:
                {
                    t->day = atoi(buf);
                    break;
                }
            //time    
            case 4:
                {
    #ifdef HWCLOCK
                    buf[2] = '';
                    t->hour = atoi(buf);
    
                    buf[5] = '';
                    t->min = atoi(buf+3);
    
                    t->sec = atoi(buf+6);
    #else
                    sscanf(buf,"%d:%d:%d",&t->hour,&t->min,&t->sec);
    #endif
                    break;
                }
    #ifdef HWCLOCK
            case 5:
                {
                    t->year = atoi(buf);
                    break;
                }
    #else
            //cst
            case 5:
                {
                    break;
                }
            //year    
            case 6:
                {
                    t->year = atoi(buf);
                    break;
                }
    #endif
    
            default:break;
            
        }
    
    }
    
    void GetTimeStruct(time_s *t,char *buf)
    {
        int len = strlen(buf);
        int i = 0;
        int j = 0;
        int index = 0;
        
        char temp[20];
    
        if(!t || !buf)
        {
            return ;
        }
    
        memset(temp,0,sizeof(temp));    
        for(;i < len ; i++)
        {
            if(buf[i] != ' ')
            {
                temp[j] = buf[i];
                j++;            
            }
            else
            {
                index++;
                //printf("get %s index %d
    ",temp,index);
                FillInElem(t,temp,index);
                memset(temp,0,sizeof(temp));
                j = 0;
    #ifdef HWCLOCK
                if(index == 2)
                {
                    i++;
                }
                if(index >= 5)
                {
                    return;
                }
    #endif    
            }
            
        }
    
        //printf("get %s 
    ",temp);
        index++;
        FillInElem(t,temp,index);
    }
    
    
    int GetHWClock(time_s *t)
    {
        char buf[128];
    #ifdef HWCLOCK
        system("hwclock > time.txt");
    
    #else
        system("date > time.txt");
    
    #endif
    
        FILE *fp = NULL;
    
        if((fp = fopen("time.txt","r")) != NULL)
        {
            fgets(buf,sizeof(buf),fp);
            fclose(fp);
    
            GetTimeStruct(t,buf);
            //printf("get :%s",buf);
            system("rm time.txt");
            return 1;
        }
        else
        {
            return 0;
        }
        
    }
    
    int IsRunYear(YEAR y)
    {
        if( (y % 400 == 0) || ( (y % 4 == 0)&&(y % 100 != 0) ))
        {
            return 1;
        }
        return 0;
    }
    
    unsigned long long GetTickCount(time_s *t)
    {
        if(t)
        {
            unsigned long long temp = 0;
            int RunYearNum = 0;// run nian  365
    
            int i = 0;
    
            //run nian
            for(i = 1970 ;i < t->year ; i++)
            {
                if( IsRunYear(i) == 1)
                {
                    RunYearNum++;
                }
            }
    
            temp += RunYearNum* 366 * 24 * 60 * 60;
            temp += (t->year - 1970 - RunYearNum)* 365 * 24 * 60 * 60;
            //printf("%d run temp %llu
    ",RunYearNum,temp);
            
            //month
            int day = 0;
            for(i = 1; i < t->mon ; i++)
            {
                if(i == 2)
                {
                    if(IsRunYear(t->year) == 1)
                    {
                        day += 29;
                    }
                    else
                    {
                        day += 28;
                    }
                }
                else if((i == 3) || (i == 5) || (i == 7) || (i == 8) || (i == 10) || (i == 12))
                {
                    day += 31;
                }
                else
                {
                    day += 30;
                }
            }
            
            temp += day*24*60*60;
            //printf("day  %d temp %llu
    ",day,temp);
            //day
            temp += (t->day - 1)*24*60*60;
    
            //hour 
            temp += (t->hour)*60*60;
    
            //min
            temp += (t->min)*60;
    
            //sec
            temp += t->sec;
    
            return temp;
            
        }
        else
        {
            return 0;
        }
    
    }
    
    int main(void)
    {
        time_s t;
        
        while(1)
        {
            GetHWClock(&t);
            PrintTimeStruct(&t);
        
            printf("tick  %llu 
    ",GetTickCount(&t));
            sleep(1);
        }
    
        
        
        return 0;
    }
  • 相关阅读:
    kafka常见问题汇总
    kafka可视化工具kafkatool
    VB.NET DevExpress GirdView 搜素框界面Find Clear按钮转换为自定义中文
    winform DevExpress GridView复制单元格方法
    DevExPress GridView获取单元格坐标和内容
    Winform Log4Net使用(一)(产生yyyyMMdd'.log)便于每天使用记录一眼能看出哪天使用时出错
    winform 判断重复检测,是否开启相同应用程序 和 线程异常捕获
    winfrom Run状态控件刷新办法
    C# winform Panel自定义移动窗口
    C# 控制台CMD辅助类
  • 原文地址:https://www.cnblogs.com/xiaowenhu/p/3286993.html
Copyright © 2020-2023  润新知