1. 程式人生 > >Linux 各種BCD時間與Unix時間戳格式轉換

Linux 各種BCD時間與Unix時間戳格式轉換

    在Linux C或C++程式設計中,因為應用場景的不同,經常會遇到各種時間之間的裝換,有時需要BCD時間,有時需要Unix時間戳,也有叫絕對時間的。這裡介紹幾種時間格式轉換的應用。

Unix時間戳:

    Unix時間戳是一個絕對值,表示距離時間(1970-1-1, 00:00:00)的秒數。在C\C++ 語言中,用資料型別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 \n",now);
}

行結果為:

[email protected]:~/test/test$ ./a.out 
Now:1515229831 
[email protected]:~/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("\nGet_CurBCDTime6 :");
	for(int i=0;i<LEN-1;i++)
	{
		printf("%02x",l_arrBcdtime[i]);
	}
	printf("\n");
	return 0;
}
執行結果為:
[email protected]:~/test/test$ gcc time.c
[email protected]:~/test/test$ ./a.out 
Get_CurBCDTime7 :20180106171651
Get_CurBCDTime6 :180106171651
[email protected]:~/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 \n",l_s32UnixTime);
	return 0;
}
執行結果:
[email protected]:~/test/test$ ./a.out 
l_s32UnixTime = 1515222601 
[email protected]:~/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 \n",str);
	return 0;
}

執行結果:

[email protected]:~/test/test$ ./a.out     
It is now 05 PM 
[email protected]:~/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.\n", newtime);
    printf("%s\n",tmpbuf);
}
執行結果為:
[email protected]:~/test/test$ gcc timer.c 
[email protected]:~/test/test$ ./a.out 
Today is Saturday, day 06 of January in the year 2018.

[email protected]:~/test/test$ 





相關推薦

Linux 各種BCD時間Unix時間格式轉換

    在Linux C或C++程式設計中,因為應用場景的不同,經常會遇到各種時間之間的裝換,有時需要BCD時間,有時需要Unix時間戳,也有叫絕對時間的。這裡介紹幾種時間格式轉換的應用。Unix時間戳:    Unix時間戳是一個絕對值,表示距離時間(1970-1-1, 0

JavaScript 時間Unix時間互相轉換,指定時間轉換或獲取當前時間

工作上用到這個還挺多的,做個簡單的隨筆,以後查詢的時候比較方便: 一般JS獲取的時間戳預設是13位數字,在個人的工作中,PHP後臺只需要精確到秒就行,看各位親的需要了, 程式碼註釋裡儘量寫的比較清楚了 <( ̄︶ ̄)↗[GO!] <!DO

日期時間unix時間互轉

1、時間---->時間戳 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.prin

oracle中日期型別unix 時間轉換

Unix時間戳記是從'1970-01-01 00:00:00'GMT開始的秒數,表現為整數型。 Oracle中的時間是Date型,以下函式提供了兩種時間轉換的Oracle函式 (1)從Unix時間戳記轉換為Oracle時間 create or replace function

Oracle中日期型別 Unix 時間的…

Unix時間戳記是從'1970-01-01 00:00:00'GMT開始的秒數,表現為整數型。 Oracle中的時間是Date型,以下函式提供了兩種時間轉換的Oracle函式 (1)從Unix時間戳記轉換為Oracle時間 create or replace function unix_to_oracle(

OracleUnix時間轉換

思路就是明白unix/linux時間戳是按照從格林威治時間1970年1月1日期計算的一個秒數unix/linux 時間戳轉換為標準時間格式(主要是注意時區問題):select TO_DATE('19700101','yy

JavaUnix時間的相互轉換

Java將Unix時間戳轉換成指定格式日期 當從伺服器獲取資料的時候,有時候獲取的資料中的時間在很多的情況下是時間戳類似於這樣1473048265,當然,我們不可能將這些資料以時間戳的形式展示給使用者

UTC時間、GMT時間、本地時間Unix時間

str style 狀態 blog 規則 引用 asp diff targe 引用: https://blog.csdn.net/u012102306/article/details/51538574 https://blog.csdn.net/foxir/articl

如何讓linux時間internet時間同步(centos)

https://www.cnblogs.com/itxiongwei/p/5556558.html   筆者在使用linux時(虛擬機器),經常會發現使用一段時間後,linux時間和我的宿主機(真實機)的時間不一致,而宿主機的時間確實是internet時間,安裝linux時選擇的時區也是Asia

Linux系統時間硬體時間時間同步

Linux系統有系統時間和硬體時間之分: 系統時間: 一般說來就是我們執行 date命令看到的時間,linux系統下所有的時間呼叫(除了直接訪問硬體時間的命令)都是使用的這個時間。 硬體時間:主機板上BIOS中的時間,由主機板電池供電來維持執行,系統開機時要讀取這個時間,

幾個時間:UTC、GMT、本地時間Unix時間

80年 世界 ive 本地 時間 使用 格林尼治 mea gre UTC(Coordinated Universal Time)時間:協調世界時,即世界標準時間 GMT(Greenwich Mean Time):格林威治/格林尼治時間 GMT=UTC,均使用秒數來計算。 U

時間:UTC時間、GMT時間、本地時間Unix時間

1.UTC時間 與 GMT時間 我們可以認為格林威治時間就是時間協調時間(GMT=UTC),格林威治時間和UTC時間均用秒數來計算的。 2.UTC時間 與 本地時 UTC + 時區差 = 本地時間

Unix timestamp時間 普通時間 轉換方法

下面以java 轉換方法為例 說明 java時間轉換成unix timestamp import java.text.DateFormat; import java.text.Parse

時間unix時間

#include <stdio.h> static int Leap_MonthDay[12]={0,31,60,91,121,152,182,213,244,274,305,335}; static int NoLeap_MonthDay[12]={0,31,

linux時間tomcat時間不一致

今天遇到個很奇怪問題,就是專案部署到linux後,有個任務會定時生成檔案,檔名包含了當前時間,但是檔名中的時間與檔案生成時間不一致,少了八個小時,如圖: 一開始以為是linux系統時間有問題,就輸入指令date檢視 時區跟我們常用的不一樣,寫得是HKT,可能是與t

linux時間北京時間同步

1.檢視linux所在時區,因為剛開系統時區不一定在中國 # date -R  2.安裝ntpdate服務 yum install ntpdate 3.選擇同步時區 Asia>China>beijing  4.修改時區 TZ='Asia/Shanghai'; e

判斷所需時間現在時間的大小

inpu log put getdate var tin () val con // 判斷集合時間 var date=new Date($("input[name=‘mettingTime‘]").val()); var now=new Date();

在MySQL 5.7日誌時間本地時間不一致的問題

row variables oba var mps 問題 fec nbsp mysql 5.7 在MySQL 5.7.2 新增了 log_timestamps 這個參數,該參數主要是控制 error log、genera log,等等記錄日誌的顯示時間參數。 在 5.7.2

crontab 執行時間系統時間不一致

工作原因:修改系統時間後,未重啟rsyslogservice crond restartservice rsyslog restart本文出自 “不拋棄!不放棄” 博客,請務必保留此出處http://thedream.blog.51cto.com/6427769/1969697crontab 執行時間與系統時

詳解FPGA中的建立時間保持時間

col 也會 可能 back IV 最小 png 思想 通信 概念對於一個數字系統而言,建立時間和保持時間可以說是基礎中的基礎,這兩個概念就像是數字電路的地基,整個系統的穩定性絕大部分都取決於是否滿足建立時間和保持時間。但是對於絕大部分包括我在內的初學者來說,建立時間和保