C 语言的标准时间封装

Posted 客家族_祖仙教_小凡仙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言的标准时间封装相关的知识,希望对你有一定的参考价值。

C语言处理时间有很多函数和结构体类型完成,并且涉及到时间戳,标准时间,本地时间的转换。学习起来感觉头大,外加上小写并且简写函数名称,就难以理解。

代码中解释

#include <time.h>
#include <string.h>
#include <stdio.h>
#include <sys/time.h>
typedef time_t TimeStamp; //旧的时间戳类型 给他其个新名字
typedef struct tm scTime;  //旧的时间结构 临时改个名 或许也不需要typedef struct DateTime   //新的时间结构体类型


    unsigned int Year;
    unsigned int Month;
    unsigned int Day;
    unsigned int Hour;
    unsigned int Minute;
    unsigned int Second;
    unsigned int DayofWeek;
    unsigned int DayofYear;
 TDateTime;

typedef struct              //新的时间类型 除了秒外的

  unsigned long time_mil ;//1毫秒 = 1秒/1000 
  unsigned long time_mic ;//1微秒 = 1毫秒/1000
  unsigned long time_nsec ;//1纳秒 = 1微秒/1000

 Time;

TimeStamp GetTimeStamp( )  //获得时间戳
    TimeStamp stamp;
    time (&stamp);     //这个函数在C里面就是获得时间戳的
    return stamp;
;

Time GetTime()   //返回秒后面的更小的精度


     int time_mil = 0;//1毫秒 = 1秒/1000 
     int time_mic = 0;//1微秒 = 1毫秒/1000
     int time_nse = 0;
     long l_nsec  = 0;
     struct timespec tn; //纳秒结构体

     clock_gettime(CLOCK_REALTIME, &tn);  //使用该函数获得高精度时间

     l_nsec   = tn.tv_nsec;
     time_mil = tn.tv_nsec/1000000;       //需要对纳秒数进行分离 从而获得毫秒 微秒
     time_mic = (tn.tv_nsec-time_mil*1000000)/1000;
     time_nse = (tn.tv_nsec-time_mil*1000000-time_mic*1000);

     Time l_thisTime;

     l_thisTime.time_mil = time_mil;
     l_thisTime.time_mic = time_mic;
     l_thisTime.time_nsec= time_nse;

     return l_thisTime;

;


TDateTime TimeStampToDateTime(TimeStamp *pTimeStamp) //时间戳转日期格式    struct tm *pold_DateTime;   
    TDateTime l_date;

    pold_DateTime=gmtime(pTimeStamp);    //通过旧日期结构体转换函数

    l_date.Year   = pold_DateTime->tm_year+1900; //时间戳是从1900年开始
    l_date.Month  = pold_DateTime->tm_mon+1;       //月是从0开始
    l_date.Day    = pold_DateTime->tm_mday;
    l_date.Hour   = pold_DateTime->tm_hour;
    l_date.Minute = pold_DateTime->tm_min;
    l_date.Second = pold_DateTime->tm_sec;
    l_date.DayofYear = pold_DateTime->tm_yday+1;  //从0开始
    l_date.DayofWeek = pold_DateTime->tm_wday;

    return  l_date;
;

TDateTime GetDateTimeUTC()  //获得UTC日期格式
    TDateTime l_date;
    TimeStamp l_timestamp;
    l_timestamp = GetTimeStamp( );
    l_date = TimeStampToDateTime(&l_timestamp);
    return l_date;
;

TDateTime GetDateTimeLocal(int TimeExtent) //获得本地日期格式
    TDateTime l_date;
    TimeStamp l_timestamp;
    l_timestamp = GetTimeStamp( );
    l_date = TimeStampToDateTime(&l_timestamp);
    l_date.Hour= l_date.Hour+TimeExtent;
    return l_date;
;


DateTimeToStr(const TDateTime datetime,char *pStrDateTime) //日期转字符串

    char StrDateTime [25] = 0;
    char lcTemp[4] =0;
    char lcSeparator1[2] = '-';  //分隔符必须是字符串 后面要跟\\0
    char lcSeparator2[2] = ' ';   //用字符变量无法使用strcat()
    char lcSeparator3[2] = ':';

    itoa(datetime.Year,lcTemp,10);     //整数转字符串以10进制表现
    strcat(StrDateTime,lcTemp);           //字符拼接函数
    strcat(StrDateTime,lcSeparator1); 


    if (datetime.Month < 10 )                //个位数前面置0
    
       itoa(0,lcTemp,10);
       strcat(StrDateTime,lcTemp);
    
    itoa(datetime.Month,lcTemp,10);
    strcat(StrDateTime,lcTemp);
    strcat(StrDateTime,lcSeparator1);


    if(datetime.Day < 10)           
    
       itoa(0,lcTemp,10);
       strcat(StrDateTime,lcTemp);  
    
    itoa(datetime.Day,lcTemp,10);
    strcat(StrDateTime,lcTemp);
    strcat(StrDateTime,lcSeparator2);

    if(datetime.Hour < 10)
    
       itoa(0,lcTemp,10);
       strcat(StrDateTime,lcTemp);  
       
    itoa(datetime.Hour,lcTemp,10);
    strcat(StrDateTime,lcTemp);
    strcat(StrDateTime,lcSeparator3);

    if(datetime.Minute < 10)
    
       itoa(0,lcTemp,10);
       strcat(StrDateTime,lcTemp);  
       
    itoa(datetime.Minute,lcTemp,10);
    strcat(StrDateTime,lcTemp);
    strcat(StrDateTime,lcSeparator3);

    if(datetime.Second < 10)
    
       itoa(0,lcTemp,10);
       strcat(StrDateTime,lcTemp);  
       
    itoa(datetime.Second,lcTemp,10);
    strcat(StrDateTime,lcTemp);

    int i=0;
    for ( i = 0 ;i < 25; i++)          //循环赋值给返回变量
    (
      pStrDateTime[i]=StrDateTime[i]
    );
;


int main()

 TimeStamp time_stamp;

 TDateTime thisDateTime ,thisLocalDateTime ;
 char StrLcalDateTime [25] ;

 time_stamp = GetTimeStamp(); 
 thisDateTime = GetDateTimeUTC();
 thisLocalDateTime =GetDateTimeLocal(8);
 DateTimeToStr(thisLocalDateTime,StrLcalDateTime);
 Time thisTime = GetTime();

printf("UTC TimeStamp :%d\\n", time_stamp); 
printf("UTC Datetime  %d-%d-%d %d:%d:%d\\n", 
  thisDateTime.Year,thisDateTime.Month ,thisDateTime.Day,thisDateTime.Hour,thisDateTime.Minute,thisDateTime.Second);  

printf("Local Datetime Str:%s\\n", StrLcalDateTime); 
printf("The Time isMillisecond.Microsecond.NanoSecond:%d.%d.%d\\n",thisTime.time_mil,thisTime.time_mic,thisTime.time_nsec);
printf("How day of year today? %d\\n",thisLocalDateTime.DayofYear);
printf("How week today ? %d\\n",thisLocalDateTime.DayofWeek) ;

 return 0;

 

当然代码写得不够高效,大量使用值传和本地变量。

 

UTC TimeStamp :1615730198
UTC Datetime  2021-3-14 13:56:38
Local Datetime Str:2021-03-14 21:56:38
The Time isMillisecond.Microsecond.NanoSecond:171.678.500
How day of year today? 73
How week today ? 0

--------------------------------
Process exited after 0.01856 seconds with return value 0
请按任意键继续. . .

希望大家多多关注我的公众号:

https://mp.weixin.qq.com/s/tzzEw4Sknz06O4bf9igQow

 

以上是关于C 语言的标准时间封装的主要内容,如果未能解决你的问题,请参考以下文章

C++--标准库 字符串类

C语言秒数转换成标准时间,求解答!

C语言用字量计算FOR环

请问c语言中用字符数组怎么判断输入的一串数字是大于等于或者小于0呢

C语言中时间的函数

windows下的c语言和linux 下的c语言以及C标准库和系统API