zoukankan      html  css  js  c++  java
  • Linux 各种BCD时间与Unix时间戳格式转换

    在Linux C或C++编程中,因为应用场景的不同,经常会遇到各种时间之间的装换,有时需要BCD时间,有时需要Unix时间戳,也有叫绝对时间的。这里介绍几种时间格式转换的应用。

    Unix时间戳:
        Unix时间戳是一个绝对值,表示距离时间(1970-1-1, 00:00:00)的秒数。在CC++ 语言中,用数据类型time_t 表示时间戳,time_t 本质上是一个long int。获取当前时间的时间戳代码如下所示:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int main(int argc, const char * argv[])
    {
    time_t now;
    time(&now);
    printf("Now:%ld ",now);
    }
    行结果为:

    biao@ubuntu:~/test/test$ ./a.out
    Now:1515229831
    biao@ubuntu:~/test/test$
    BCD时间:
        所谓BCD时间就是以BCD码形式表示的时间。比如整型0x201801061647 表示2018年1月6日16时47分。

    下面举例几种BCD时间的转换:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    /***************************************************************************
    *函数名称:Char2Bcd
    *函数介绍:字符串转BCD
    *输入参数:-buf:指向字符串
    *输出参数:无
    *返回值 :转换后的双精度值
    *修改历史:
    ***************************************************************************/
    char Char2Bcd(char i_cHexData)
    {
    char i;
    i=((i_cHexData%100)/10)*16+(i_cHexData%10);
    return i;
    }

    /***************************************************************************
    *函数名称:Get_BCDTime7
    *函数介绍:转换为BCD码格式时间
    *输入参数:-*time:
    *输出参数:无
    *返回值 :无
    *修改历史:
    ***************************************************************************/
    void Get_BCDTime7(time_t i_tTime,char* o_cpBcdTime)
    {
    struct tm *time;
    time=localtime(&i_tTime);
    o_cpBcdTime[0]=Char2Bcd((time->tm_year+1900)/100);
    o_cpBcdTime[1]=Char2Bcd((time->tm_year+1900)%100);
    o_cpBcdTime[2]=Char2Bcd(time->tm_mon+1);
    o_cpBcdTime[3]=Char2Bcd(time->tm_mday);
    o_cpBcdTime[4]=Char2Bcd(time->tm_hour);
    o_cpBcdTime[5]=Char2Bcd(time->tm_min);
    o_cpBcdTime[6]=Char2Bcd(time->tm_sec);
    }

    /***************************************************************************
    *函数名称:Get_CurBCDTime6
    *函数介绍:转换为BCD码格式时间
    *输入参数:-*time:
    *输出参数:无
    *返回值 :无
    *修改历史:
    ***************************************************************************/
    void Get_BCDTime6(time_t i_tTime,char* o_cpBcdTime)
    {
    struct tm *time;
    time=localtime(&i_tTime);
    o_cpBcdTime[0]=(unsigned char)((((time->tm_year-100)/10)<<4)|((time->tm_year-100)%10));
    o_cpBcdTime[1]=(unsigned char)((((1+time->tm_mon)/10)<<4)|((1+time->tm_mon)%10));
    o_cpBcdTime[2]=(unsigned char)((((time->tm_mday)/10)<<4)|((time->tm_mday)%10));
    o_cpBcdTime[3]=(unsigned char)((((time->tm_hour)/10)<<4)|((time->tm_hour)%10));
    o_cpBcdTime[4]=(unsigned char)((((time->tm_min)/10)<<4)|((time->tm_min)%10));
    o_cpBcdTime[5]=(unsigned char)((((time->tm_sec)/10)<<4)|((time->tm_sec)%10));
    }

    /***************************************************************************
    *函数名称:Get_CurBCDTime6
    *函数介绍:获取当前BCD码格式时间
    *输入参数:-*time:
    *输出参数:无
    *返回值 :无
    *修改历史:add by lianzihao 2016-09-13
    ***************************************************************************/
    void Get_CurBCDTime6(char* o_cpBcdTime)
    {
    time_t lt=0;
    lt = time(NULL);
    struct tm * pCurTime = localtime(<);
    o_cpBcdTime[0]=(unsigned char)((((pCurTime->tm_year-100)/10)<<4)|((pCurTime->tm_year-100)%10));
    o_cpBcdTime[1]=(unsigned char)((((1+pCurTime->tm_mon)/10)<<4)|((1+pCurTime->tm_mon)%10));
    o_cpBcdTime[2]=(unsigned char)((((pCurTime->tm_mday)/10)<<4)|((pCurTime->tm_mday)%10));
    o_cpBcdTime[3]=(unsigned char)((((pCurTime->tm_hour)/10)<<4)|((pCurTime->tm_hour)%10));
    o_cpBcdTime[4]=(unsigned char)((((pCurTime->tm_min)/10)<<4)|((pCurTime->tm_min)%10));
    o_cpBcdTime[5]=(unsigned char)((((pCurTime->tm_sec)/10)<<4)|((pCurTime->tm_sec)%10));
    }
    /***************************************************************************
    *函数名称:Get_CurBCDTime7
    *函数介绍:获取当前BCD码格式时间
    *输入参数:-*time:
    *输出参数:无
    *返回值 :无
    *修改历史:
    ***************************************************************************/
    void Get_CurBCDTime7(char* o_cpBcdTime)
    {
    time_t tt;
    struct tm *curtime;
    time(&tt);
    curtime=localtime(&tt);
    o_cpBcdTime[0]=Char2Bcd((curtime->tm_year+1900)/100);
    o_cpBcdTime[1]=Char2Bcd((curtime->tm_year+1900)%100);
    o_cpBcdTime[2]=Char2Bcd(curtime->tm_mon+1);
    o_cpBcdTime[3]=Char2Bcd(curtime->tm_mday);
    o_cpBcdTime[4]=Char2Bcd(curtime->tm_hour);
    o_cpBcdTime[5]=Char2Bcd(curtime->tm_min);
    o_cpBcdTime[6]=Char2Bcd(curtime->tm_sec);
    }

    #define LEN 7
    int main(void)
    {
    char l_arrBcdtime[LEN] ={0};
    Get_CurBCDTime7(l_arrBcdtime);
    printf("Get_CurBCDTime7 :");
    for(int i=0;i<LEN;i++)
    {
    printf("%02x",l_arrBcdtime[i]);
    }

    Get_CurBCDTime6(l_arrBcdtime);

    printf(" Get_CurBCDTime6 :");
    for(int i=0;i<LEN-1;i++)
    {
    printf("%02x",l_arrBcdtime[i]);
    }
    printf(" ");
    return 0;
    }
    运行结果为:
    biao@ubuntu:~/test/test$ gcc time.c
    biao@ubuntu:~/test/test$ ./a.out
    Get_CurBCDTime7 :20180106171651
    Get_CurBCDTime6 :180106171651
    biao@ubuntu:~/test/test$
        如果需要将我们常用的时间格式转换回Unix时间戳,我们可以使用系统函数strptime来实现,strptime与函数strftime

    函数刚好相反,strftime是将Unix时间戳转换为各种时间格式。
    strptime函数:
    该函数的简单应用如下:将时间转换为Unix时间戳

    #define _XOPEN_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h>
    #include <unistd.h>

    long Time2UnixTime(void)
    {
    struct tm tmp_time;
    strptime("2018-01-6 15:10:01", "%Y-%m-%d %H:%M:%S", &tmp_time);
    time_t t = mktime(&tmp_time);
    return t;
    }

    int main(void)
    {
    int l_s32UnixTime = 0;
    l_s32UnixTime = Time2UnixTime();
    printf("l_s32UnixTime = %d ",l_s32UnixTime);
    return 0;
    }
    运行结果:
    biao@ubuntu:~/test/test$ ./a.out
    l_s32UnixTime = 1515222601
    biao@ubuntu:~/test/test$
    strftime:
    strftime函数功能很强大,可以将时间格式化为其他很多种的格式。它的原型如下:
    size_t strftime(
         char *strDest,
         size_t maxsize,
         const char *format,
         const struct tm *timeptr 
    );
    我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数。
    函数strftime()的操作有些类似于sprintf():识别以百分号(%)开始的格式命令集合,格式化输出结果放在一个字符串中。格式化命令说明串strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面,它们是区分大小写的。
    %a 星期几的简写 
    %A 星期几的全称 
    %b 月分的简写 
    %B 月份的全称 
    %c 标准的日期的时间串 
    %C 年份的后两位数字 
    %d 十进制表示的每月的第几天 
    %D 月/天/年 
    %e 在两字符域中,十进制表示的每月的第几天 
    %F 年-月-日 
    %g 年份的后两位数字,使用基于周的年 
    %G 年分,使用基于周的年 
    %h 简写的月份名 
    %H 24小时制的小时 
    %I 12小时制的小时
    %j 十进制表示的每年的第几天 
    %m 十进制表示的月份 
    %M 十时制表示的分钟数 
    %n 新行符 
    %p 本地的AM或PM的等价显示 
    %r 12小时的时间 
    %R 显示小时和分钟:hh:mm 
    %S 十进制的秒数 
    %t 水平制表符 
    %T 显示时分秒:hh:mm:ss 
    %u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
    %U 第年的第几周,把星期日做为第一天(值从0到53)
    %V 每年的第几周,使用基于周的年 
    %w 十进制表示的星期几(值从0到6,星期天为0)
    %W 每年的第几周,把星期一做为第一天(值从0到53) 
    %x 标准的日期串 
    %X 标准的时间串 
    %y 不带世纪的十进制年份(值从0到99)
    %Y 带世纪部分的十制年份 
    %z,%Z 时区名称,如果不能得到时区名称则返回空字符。
    %% 百分号

        如果想显示现在是几点了,并以12小时制显示,就象下面这段程序:

    #define _XOPEN_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h>
    #include <unistd.h>

    int main(void)
    {
    struct tm *ptr;
    time_t lt;
    char str[80];
    lt=time(NULL);
    ptr=localtime(<);
    strftime(str,100,"It is now %I %p",ptr);
    printf("%s ",str);
    return 0;
    }
    运行结果:

    biao@ubuntu:~/test/test$ ./a.out
    It is now 05 PM
    biao@ubuntu:~/test/test$ gcc timer.c
    如果要显示全部的时间,则如下:
    #define _XOPEN_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h>
    #include <unistd.h>
    void main( void )
    {
    struct tm *newtime;
    char tmpbuf[128];
    time_t lt1;
    time(<1);
    newtime=localtime(<1);
    strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y. ", newtime);
    printf("%s ",tmpbuf);
    }
    运行结果为:
    biao@ubuntu:~/test/test$ gcc timer.c
    biao@ubuntu:~/test/test$ ./a.out
    Today is Saturday, day 06 of January in the year 2018.

    biao@ubuntu:~/test/test$

    ————————————————
    版权声明:本文为CSDN博主「li_wen01」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/li_wen01/article/details/78990124

  • 相关阅读:
    UVa 10118 记忆化搜索 Free Candies
    CodeForces 568B DP Symmetric and Transitive
    UVa 11695 树的直径 Flight Planning
    UVa 10934 DP Dropping water balloons
    CodeForces 543D 树形DP Road Improvement
    CodeForces 570E DP Pig and Palindromes
    HDU 5396 区间DP 数学 Expression
    HDU 5402 模拟 构造 Travelling Salesman Problem
    HDU 5399 数学 Too Simple
    CodeForces 567F DP Mausoleum
  • 原文地址:https://www.cnblogs.com/idyllcheung/p/12522075.html
Copyright © 2011-2022 走看看