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(
Oracle與Unix時間戳的轉換
思路就是明白unix/linux時間戳是按照從格林威治時間1970年1月1日期計算的一個秒數unix/linux 時間戳轉換為標準時間格式(主要是注意時區問題):select TO_DATE('19700101','yy
Java與Unix時間戳的相互轉換
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 思想 通信 概念對於一個數字系統而言,建立時間和保持時間可以說是基礎中的基礎,這兩個概念就像是數字電路的地基,整個系統的穩定性絕大部分都取決於是否滿足建立時間和保持時間。但是對於絕大部分包括我在內的初學者來說,建立時間和保