0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux應(yīng)用開發(fā)【第十章】RTC應(yīng)用開發(fā)

weidongshan ? 來源:weidongshan ? 作者:weidongshan ? 2021-12-10 19:24 ? 次閱讀

文章目錄

10 RTC應(yīng)用開發(fā)

10.1 RTC的作用及時(shí)間表示

10.2 RTC的操作命令

10.2.1 系統(tǒng)時(shí)間和硬件時(shí)間

10.2.2 系統(tǒng)時(shí)間操作命令

10.2.3 硬件時(shí)間操作命令

10.3 RTC的數(shù)據(jù)結(jié)構(gòu)和函數(shù)

10.3.1 時(shí)間相關(guān)的數(shù)據(jù)結(jié)構(gòu)

1.time_t 類型:長整型

2.struct timeb 結(jié)構(gòu)

3.struct timeval 和struct timezone結(jié)構(gòu)

4.struct tm 結(jié)構(gòu)

10.3.2時(shí)間相關(guān)的函數(shù)

1.時(shí)間格式化函數(shù)

2.localtime函數(shù)

3.mktime函數(shù)

4.asctime函數(shù)

5.ctime函數(shù)

10.4 RTC時(shí)間的編程實(shí)例

10 RTC應(yīng)用開發(fā)

10.1 RTC的作用及時(shí)間表示

? “RTC”的英文全稱是Real-Time Clock,翻譯過來是實(shí)時(shí)時(shí)鐘芯片實(shí)時(shí)時(shí)鐘芯片是日常生活中應(yīng)用最為廣泛的電子器件之一,它為人們或者電子系統(tǒng)提供精確的實(shí)時(shí)時(shí)間。實(shí)時(shí)時(shí)鐘芯片通過引腳對外提供時(shí)間讀寫接口,通常內(nèi)部帶有電池,保證在外部系統(tǒng)關(guān)電時(shí),內(nèi)部電路正常工作,時(shí)間正常運(yùn)行。不同的時(shí)鐘芯片內(nèi)部機(jī)制不一樣,時(shí)間數(shù)據(jù)存儲(chǔ)格式、讀寫操作方式也不一樣,Linux系統(tǒng)和驅(qū)動(dòng)封裝了不同時(shí)鐘芯片的操作細(xì)節(jié),為應(yīng)用程序提供了統(tǒng)一的時(shí)間操作接口。

? 那么在Linux世界里,時(shí)間是怎么表示的呢?是不是與人們一樣用年月日+時(shí)分秒來表示時(shí)間呢?聰明的程序員自然不會(huì)讓計(jì)算機(jī)這么做,正所謂越簡單越科學(xué),直接用一個(gè)整數(shù)表示時(shí)間,這個(gè)整數(shù)代表當(dāng)前與Epoch Time的時(shí)間差(以秒為單位)。Epoch Time 是指一個(gè)特定的時(shí)間:1970年1月1日0時(shí)0分0秒。假設(shè)現(xiàn)在距離1970年1月1日0時(shí)0分0秒走了N秒,在Linuxx系統(tǒng)里,時(shí)間數(shù)值就是N。

? 那么問題來了,為什么要從1970年1月1日0時(shí)0分0秒開始呢?那年發(fā)生了什么,以至于Unix系統(tǒng)以它作“紀(jì)元”。原來Unix就是在那個(gè)時(shí)代產(chǎn)生的,1969年發(fā)布的雛形,最早是基于硬件60Hz的時(shí)間計(jì)數(shù)。1971年底出版的《Unix Programmer’s Manual》里定義的Unix Time是以1971年1月1日00:00:00作為起始時(shí)間,每秒增長60。后來考慮到如果每秒60個(gè)數(shù)字,則1.1年后時(shí)間值就到達(dá)最大,于是改成以秒為計(jì)數(shù)單位,時(shí)間能表示到68.1年之長,就不在乎起始時(shí)間是1970還是1971年,遂改成人工記憶、計(jì)算比較方便的1970年。于是Unix的世界開啟了“紀(jì)元”,Unix時(shí)間戳也就成為了一個(gè)專有名稱。后Linux系統(tǒng)沿用了這種定義時(shí)間的方式。

? 當(dāng)時(shí)計(jì)算機(jī)操作系統(tǒng)是32位,時(shí)間也是用一個(gè)32位的有符號數(shù)來表示,數(shù)據(jù)取值范圍為-2147483648~2147483647,也就是說時(shí)間最大值只能取到2147483647(秒),換算成年也即2147483647÷365÷24÷60÷60=68.1年,也就是說32位能表示的最長時(shí)間是1970+68.1=2038年。精確點(diǎn)講,2038年01月19日03時(shí)14分07秒,時(shí)間便會(huì)達(dá)到最大值,為0x7FFFFFFF。過了這個(gè)時(shí)間點(diǎn),下一秒時(shí)間值便會(huì)變?yōu)?x80000000,算下來也就是1901年12月13日20時(shí)45分52秒,這樣便會(huì)出現(xiàn)時(shí)間回歸的現(xiàn)象,很多系統(tǒng)便會(huì)運(yùn)行異常。

? 上邊說過了,那是Unix系統(tǒng)“元年”時(shí)候的事情,32位的時(shí)間已經(jīng)足以解決當(dāng)時(shí)的問題了?,F(xiàn)在主流CPU都是64位的,使用64位的數(shù)據(jù)表示時(shí)間也是順其自然的事,用64位的有符號數(shù)來表示時(shí)間,可以表示到292,277,026,596年12月4日15時(shí)30分08秒,相信我們再也不用愁時(shí)間回歸的問題了。

10.2 RTC的操作命令

? 弄清楚了時(shí)間怎么表示之后,Linux是怎么使用和維護(hù)時(shí)間的呢?我們怎么通過Linux操作時(shí)間呢?

10.2.1 系統(tǒng)時(shí)間和硬件時(shí)間

? 在Linux中有系統(tǒng)時(shí)鐘與硬件時(shí)鐘兩種時(shí)鐘。系統(tǒng)時(shí)間是由CPU主芯片的定時(shí)器進(jìn)行維護(hù)的時(shí)間,一般情況下都會(huì)選擇芯片上精度最高的定時(shí)器作為系統(tǒng)時(shí)間的定時(shí)基準(zhǔn),以避免在系統(tǒng)運(yùn)行較長時(shí)間后出現(xiàn)大的時(shí)間偏移。特點(diǎn)是系統(tǒng)掉電后,系統(tǒng)時(shí)間將丟失。硬件時(shí)鐘是指系統(tǒng)中包含的RTC芯片內(nèi)部所維護(hù)的時(shí)間。RTC芯片都有電池+系統(tǒng)電源的雙重供電機(jī)制,在系統(tǒng)正常工作時(shí)由系統(tǒng)供電,在系統(tǒng)掉電后由電池進(jìn)行供電。因此系統(tǒng)電源掉電后RTC時(shí)間仍然能夠正常運(yùn)行,Linux系統(tǒng)中硬件時(shí)鐘的基本目的是在Linux不運(yùn)行時(shí)保持時(shí)間。

? 在Linux啟動(dòng)時(shí),將系統(tǒng)時(shí)間從硬件時(shí)鐘初始化,然后不再使用硬件時(shí)鐘。在系統(tǒng)開機(jī)時(shí),由Linux操作系統(tǒng)從RTC芯片讀取硬件時(shí)間后,由CPU內(nèi)部定時(shí)器維護(hù)時(shí)間運(yùn)行。此后操作系統(tǒng)使用的時(shí)間都是系統(tǒng)時(shí)間,如果沒有顯式的通過命令去控制RTC的讀寫操作,系統(tǒng)將不會(huì)再從RTC中去獲取或者同步設(shè)置時(shí)間。

10.2.2 系統(tǒng)時(shí)間操作命令

? 查看系統(tǒng)時(shí)間:

date
Sat May  1 08:11:19 EDT 2020

? 格式化輸出:

date +"%Y-%m-%d" 
2020-05-01

? 2秒后輸出:

date -d "2 second" +"%Y-%m-%d %H:%M.%S"
2020-05-01 14:21.31

? 顯示1234567890秒的時(shí)間:

date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S"
2009-02-13 23:02:30

? 普通轉(zhuǎn)格式:

date -d "2009-05-01" +"%Y/%m/%d %H:%M.%S"
2020/05/01 00:00.00

? 輸出其他日期:

date -d "+1 day" +%Y%m%d   #顯示后一天的日期 
date -d "-1 day" +%Y%m%d   #顯示前一天的日期 
date -d "-1 month" +%Y%m%d #顯示上一月的日期 
date -d "+1 month" +%Y%m%d #顯示下一月的日期 
date -d "-1 year" +%Y%m%d  #顯示前一年的日期 
date -d "+1 year" +%Y%m%d  #顯示下一年的日期

? 設(shè)置系統(tǒng)時(shí)間:

date -s 20200501 #設(shè)置成20200501,這樣會(huì)把具體時(shí)間設(shè)置成空00:00:00 
date -s 01:01:01 #設(shè)置具體時(shí)間,不會(huì)對日期做更改 
date -s "01:01:01 2020-05-01" #這樣可以設(shè)置全部時(shí)間 
date -s "01:01:01 20200501"    #這樣可以設(shè)置全部時(shí)間 
date -s "2020-05-01 01:01:01" #這樣可以設(shè)置全部時(shí)間 
date -s "20200501 01:01:01"    #這樣可以設(shè)置全部時(shí)間

? 命令更多參數(shù)使用方法可訪問:https://www.cnblogs.com/machangwei-8/p/10352546.html

10.2.3 硬件時(shí)間操作命令

? 顯示硬件時(shí)間:

hwclock或 hwclock -r 或 hwclock --show
2000年04月11日 星期二 13時(shí)24分35秒  -0.109687 seconds 

? 設(shè)置硬件時(shí)鐘:

hwclock --set --date '2015-04-11 13:36:11'11

? 將系統(tǒng)時(shí)鐘同步到硬件時(shí)鐘:

hwclock -w

? 將硬件時(shí)鐘同步到系統(tǒng)時(shí)鐘:

hwclock -s

? 命令更多參數(shù)使用方法可訪問:https://www.cnblogs.com/wj78080458/p/9806774.html

10.3 RTC的數(shù)據(jù)結(jié)構(gòu)和函數(shù)

? 在Linux環(huán)境中,我們學(xué)會(huì)了使用命令,修改系統(tǒng)時(shí)間和硬件時(shí)間。在編程時(shí)我們當(dāng)然可以直接使用system系統(tǒng)調(diào)用來操作時(shí)間,但是這樣既顯得不夠?qū)I(yè),也不能滿足大部分需求,因?yàn)楹芏嗲闆r下我們不只是要修改時(shí)間,而是要對時(shí)間進(jìn)行運(yùn)算處理。

? RTC編程,重點(diǎn)是學(xué)習(xí)時(shí)間相關(guān)的結(jié)構(gòu)體和相關(guān)操作函數(shù)。

10.3.1 時(shí)間相關(guān)的數(shù)據(jù)結(jié)構(gòu)

? 在C語言涉及中經(jīng)常需要定時(shí)觸發(fā)事件,涉及到獲取系統(tǒng)時(shí)間,其結(jié)構(gòu)體類型有多種。Linux系統(tǒng)下,與時(shí)間有關(guān)的數(shù)據(jù)類型定義在頭文件 /usr/include/sys/time.h 中:

只要有以下幾種時(shí)間相關(guān)的數(shù)據(jù)類型:

1.time_t 類型:長整型

? 一般用來表示從Epoch Time(1970年1月1日午夜(00:00:00))以來的秒數(shù),單位為秒。

#define _TIME_T	
	typedef    long    time_t;        
#endif 

? 由函數(shù)time_t time(time_t* lpt)來獲取time_t 數(shù)據(jù),函數(shù)返回自Epoch Time(1970年1月1日午夜(00:00:00))起經(jīng)過的時(shí)間,以秒為單位。如果 lpt不為空,則返回值也存儲(chǔ)在lpt指向的變量中。

? 示例:

time_t t = time(NULL);

2.struct timeb 結(jié)構(gòu)

? 它有四個(gè)成員,一個(gè)是秒,另一個(gè)是毫秒。

struct timeb{    
    time_t  time;
    unsigned short millitm;     
    short   timezone;          
    short   dstflag;                
};

? time是從Epoch Time(1970年1月1日午夜(00:00:00))起累計(jì)的秒數(shù)。

? millitm是一秒內(nèi)的毫秒數(shù)。

? dstflag不為0,說明這是夏令時(shí)時(shí)間。

? timezone是UTC時(shí)間和本地時(shí)間的相差分鐘數(shù)。

? 由函數(shù)int ftime(struct timeb *tp) 來獲取timeb,調(diào)用成功返回0,調(diào)用失敗返回-1。

示例:

struct timeb tp;
ftime(&tp);   

3.struct timeval 和struct timezone結(jié)構(gòu)

? timeval 有兩個(gè)成員,一個(gè)是秒,另一個(gè)表示微秒。

struct  timeval{
	long  tv_sec;    /*秒*/
	long  tv_usec;/*微秒*/
};

? tv_sec為Epoch Time到創(chuàng)建struct timeval時(shí)的秒數(shù),tv_usec為微秒數(shù),即秒后面的零頭。比如當(dāng)tv_sec為1234567890,tv_usec為1234,即當(dāng)前時(shí)間距Epoch時(shí)間1234567890秒,1234微秒。

struct  timezone{	
    int tz_minuteswest;/*和greenwich 時(shí)間差了多少分鐘*/	
    int tz_dsttime;    /*type of DST correction*/
};
tz_minuteswest表示當(dāng)前系統(tǒng)所在時(shí)區(qū)和UTC的時(shí)間差,tz_minuteswest以分鐘計(jì)算。比如北京GMT+8區(qū),tz_minuteswest為-480。tz_dsttime的定義為日光節(jié)約時(shí)間(DST,也就是夏令時(shí)。

? 由函數(shù)int gettimeofday(struct timeval*tv,struct timezone *tz )來獲取timeval和timezone,在gettimeofday()函數(shù)中tv或者tz都可以為空。如果為空則就不返回其對應(yīng)的結(jié)構(gòu)體。函數(shù)執(zhí)行成功后返回0,失敗后返回-1,錯(cuò)誤代碼存于errno中。

示例:

struct  timeval  tv;
gettimeofday(&tv, NULL);

4.struct tm 結(jié)構(gòu)

 struct tm {
int tm_sec; /* 秒–取值區(qū)間為[0,59] */
int tm_min; /* 分 - 取值區(qū)間為[0,59] */
int tm_hour; /* 時(shí) - 取值區(qū)間為[0,23] */
int tm_mday; /* 一個(gè)月中的日期 - 取值區(qū)間為[1,31] */
int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區(qū)間為[0,11] */
int tm_year; /* 年份,其值從1900開始 */
int tm_wday; /* 星期–取值區(qū)間為[0,6],其中0代表星期天,1代表星期一,以此類推 */
int tm_yday; /* 從每年的1月1日開始的天數(shù)–取值區(qū)間為[0,365],其中0代表1月1日,1代表1月2				日,以此類推 */
int tm_isdst; /* 夏令時(shí)標(biāo)識符,實(shí)行夏令時(shí)的時(shí)候,tm_isdst為正。不實(shí)行夏令時(shí)的進(jìn)候,tm_isdst為0;				不了解情況時(shí),tm_isdst()為負(fù)。*/
};
	int   tm_sec 代表目前秒數(shù),正常范圍為0-59	
	int   tm_min 代表目前分?jǐn)?shù),范圍0-59	
	int   tm_hour 從午夜算起的時(shí)數(shù),范圍為0-23 		
	int   tm_mday 目前月份的日數(shù),范圍01-31 
	int   tm_mon 代表目前月份,從一月算起,范圍從0-11
	int   tm_year 從1900 年算起至今的年數(shù)
	int   tm_wday 一星期的日數(shù),從星期一算起,范圍為0-6
	int   tm_yday 從今年1月1日算起至今的天數(shù),范圍為0-365
	int   tm_isdst 日光節(jié)約時(shí)間的旗標(biāo)

? 由函數(shù)struct tm* gmtime(const time_t*timep)解析得到tm,gmtime()將參數(shù)timep 所指的time_t 數(shù)據(jù)類型中的信息轉(zhuǎn)換成真實(shí)世界所使用的時(shí)間日期表示方法,然后將結(jié)果由結(jié)構(gòu)tm的指針返回。
? 示例:

struct tm* tm =NULL ; 
time_t t = time(NULL);
tm = gmtime(&t);

10.3.2時(shí)間相關(guān)的函數(shù)

1.時(shí)間格式化函數(shù)

? strftime()函數(shù)原型:size_t strftime(char *str,size_t max,char *fmt,struct tm *tp);函數(shù)識別以百分號(%)開始的格式命令集合,其格式由fmt來指定,可以使用strftime 函數(shù)將時(shí)間格式轉(zhuǎn)化為我們想要的格式(其輸出結(jié)果為字符串),strftime有點(diǎn)像sprintf。

? str 表示返回的時(shí)間字符串

? count要寫入的字節(jié)的最大數(shù)量

? format 格式字符串由零個(gè)或多個(gè)轉(zhuǎn)換符和普通字符(除%)

? tm 輸入時(shí)間

? 格式命令,是區(qū)分大小寫的:

%a 星期幾的簡寫
%A 星期幾的全稱
%b 月分的簡寫
%B 月份的全稱
%c 標(biāo)準(zhǔn)的日期的時(shí)間串
%C 年份的后兩位數(shù)字
%d 十進(jìn)制表示的每月的第幾天
%D 月/天/年
%e 在兩字符域中,十進(jìn)制表示的每月的第幾天
%F 年-月-日
%g 年份的后兩位數(shù)字,使用基于周的年
%G 年分,使用基于周的年
%h 簡寫的月份名
%H 24小時(shí)制的小時(shí)
%I 12小時(shí)制的小時(shí)
%j 十進(jìn)制表示的每年的第幾天
%m 十進(jìn)制表示的月份
%M 十時(shí)制表示的分鐘數(shù)
%n 新行符
%p 本地的AM或PM的等價(jià)顯示
%r 12小時(shí)的時(shí)間
%R 顯示小時(shí)和分鐘:hh:mm
%S 十進(jìn)制的秒數(shù)
%t 水平制表符
%T 顯示時(shí)分秒:hh:mm:ss
%u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0)
%U 第年的第幾周,把星期日做為第一天(值從0到53)
%V 每年的第幾周,使用基于周的年
%w 十進(jìn)制表示的星期幾(值從0到6,星期天為0)
%W 每年的第幾周,把星期一做為第一天(值從0到53)
%x 標(biāo)準(zhǔn)的日期串
%X 標(biāo)準(zhǔn)的時(shí)間串
%y 不帶世紀(jì)的十進(jìn)制年份(值從0到99)
%Y 帶世紀(jì)部分的十進(jìn)制年份
%z,%Z 時(shí)區(qū)名稱,如果不能得到時(shí)區(qū)名稱則返回空字符。
%% 百分號

? 示例:

time_t t = time(NULL);
struct tm *info;
info = gmtime(&t);
strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info);
printf("格式化的日期 & 時(shí)間 : |%s|n", buffer );

2.localtime函數(shù)

? localtime()函數(shù)原型:struct tm *localtime(const time_t *timer) 使用 timer 的值來填充 tm 結(jié)構(gòu),timer 的值被解析為 tm 結(jié)構(gòu),并用本地時(shí)區(qū)表示

? 示例:

time_t rawtime;
struct tm *info; 
time( &rawtime ); 
info = localtime( &rawtime );

3.mktime函數(shù)

? mktime()函數(shù)原型: time_t mktime(struct tm *timeptr) 把 timeptr 所指向的結(jié)構(gòu)轉(zhuǎn)換為一個(gè)依據(jù)本地時(shí)區(qū)的 time_t 值。函數(shù)將參數(shù)timeptr所指的tm結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)換成從公元1970年1月1日0時(shí)0分0 秒算起至今的UTC時(shí)間所經(jīng)過的秒數(shù)。該函數(shù)返回一個(gè) time_t 值,該值對應(yīng)于以參數(shù)傳遞的日歷時(shí)間。如果發(fā)生錯(cuò)誤,則返回 -1 值。

? 示例:

time_t rawtime;
struct tm * timeinfo;
int year, month ,day;
/* 獲取當(dāng)前時(shí)間信息,并修改用戶輸入的輸入信息 */
time ( &rawtime );
timeinfo = localtime ( &rawtime );
timeinfo->tm_year-= 1;//去年的今天
rawtime = mktime ( timeinfo );

4.asctime函數(shù)

? asctime()函數(shù)原型: char *asctime(const struct tm *timeptr) ;函數(shù)返回一個(gè)指向字符串的指針,它代表了結(jié)構(gòu) struct timeptr 的日期和時(shí)間。包含了可讀格式的日期和時(shí)間信息 Www Mmm dd hh:mm:ss yyyy,其中,Www 表示星期幾,Mmm 是以字母表示的月份,dd 表示一月中的第幾天,hh:mm:ss 表示時(shí)間,yyyy 表示年份。

? 示例:

struct tm t;
t.tm_sec    = 10;
t.tm_min    = 10;
t.tm_hour   = 6;
t.tm_mday   = 25;
t.tm_mon    = 2;
t.tm_year   = 89;
t.tm_wday   = 6;
puts(asctime(&t));

5.ctime函數(shù)

? ctime()函數(shù)原型:char *ctime(const time_t *timer); 可以把time函數(shù)得到的結(jié)果轉(zhuǎn)換成一個(gè)時(shí)間字符串, 返回一個(gè)表示當(dāng)?shù)貢r(shí)間的字符串,當(dāng)?shù)貢r(shí)間是基于參數(shù) timer。返回的字符串格式如下: Www Mmm dd hh:mm:ss yyyy 其中,Www 表示星期幾,Mmm 是以字母表示的月份,dd 表示一月中的第幾天,hh:mm:ss 表示時(shí)間,yyyy 表示年份。調(diào)用ctime(t)等價(jià)于asctime(localtime(t))。

? 示例:

time_t curtime; 
time(&curtime); 
printf("當(dāng)前時(shí)間 = %s", ctime(&curtime));

10.4 RTC時(shí)間的編程實(shí)例

? 嵌入式Linux環(huán)境下,RTC時(shí)間編程與桌面Linux環(huán)境下的編程是一樣的。本文在桌面Linux下編程,實(shí)現(xiàn)時(shí)間顯示、計(jì)算等功能。編譯后的程序名為“mytime”,進(jìn)入程序后,使用不同命令完成不同功能,主要命令見下表:

序號 命令 功能 示例
1 p 在終端顯示當(dāng)前時(shí)間 p
2 y 在終端顯示昨天日期 y
3 n 在終端顯示現(xiàn)在距新年的天數(shù) n
4 a 根據(jù)輸入的出生年代,在終端顯示年紀(jì) a 2001
5 e 退出程序 e

? 在main函數(shù)中,首先打印函數(shù)的使用手冊,然后循環(huán)接收用戶輸入的命令,根據(jù)命令調(diào)用相應(yīng)的函數(shù):

32      //打印使用手冊
33      printf( "nn"
34            "Usage:npn"
35            "yn"
36             "nn"
37             "a 2001n"
38             "en"
39             "p:在終端顯示當(dāng)前時(shí)間ny:查看昨天日期nn:查看現(xiàn)在距新年的天數(shù)n"
40             "a:根據(jù)輸入的出生年計(jì)算出年紀(jì)ne:退出程序n"
41      );
42
43     //主程序中循環(huán)接收輸入的命令,根據(jù)不同命令執(zhí)行不同函數(shù)
44      while (1){
45              if (c !='n')
46                printf("n請輸入命令:");
47              scanf("%c",&c);
48              switch(c){
49                      case 'p'://在終端顯示當(dāng)前時(shí)間
50                              displaydate();
51                              break;
52              		case 'y'://顯示昨天日期
53                              displayyesterday();
54                              break;
55                      case 'n'://顯示現(xiàn)在距新年的天數(shù)
56                              displaynewyear();
57                              break;
58                      case 'a'://根據(jù)輸入的出生年計(jì)算出年紀(jì)
59                          	scanf("%d",&age);
60                              displayage(age);
61                              break;
62                      case 'e'://退出程序
63                              exit(0);
64                              break;
65
66                      default : /* 可選的 */
67                              break;
68      	}
69      }

? 實(shí)現(xiàn)在終端顯示當(dāng)前時(shí)間的函數(shù):

/**********************************************************
72  * 函數(shù)名稱: displaydate
73  * 功能描述: 在終端打印當(dāng)前時(shí)間信息
74  * 輸入?yún)?shù): 無
75  * 輸出參數(shù): 無
76  * 返 回 值: 無
77  * 2020/05/10         V1.0    yanxni            創(chuàng)建
78 ***********************************************************/
79 void displaydate(){
80      struct tm *ptr;
81      time_t lt;
82
83     /*獲取日歷時(shí)間*/
84     lt = time(NULL);
85
86     /*轉(zhuǎn)化為本地時(shí)間*/
87     ptr = localtime(<);
88
89     /*以本地時(shí)間的字符串方式打印*/
90     printf("%sn",ctime(<));
91
92      /*以本地時(shí)間的字符串方式打印*/
93     printf("%sn",asctime(ptr));
94
95 }

? 實(shí)現(xiàn)在終端顯示昨天日期的函數(shù):

/**********************************************************
97  * 函數(shù)名稱: displayyesterday
98  * 功能描述: 在終端打印昨天的日期
99  * 輸入?yún)?shù): 無
100  * 輸出參數(shù): 無
101  * 返 回 值: 無
102  * 2020/05/10         V1.0    yanxni            創(chuàng)建
103 ***********************************************************/
104 void displayyesterday(void){
105     struct tm *ptr;
106     time_t lt;
107
108     /*獲取日歷時(shí)間*/
109     lt = time(NULL);
110     lt -= 24*60*60;
111
112     /*轉(zhuǎn)化為本地時(shí)間*/
113     ptr = localtime(<);
114
115     /*以本地時(shí)間的字符串方式打印*/
116     printf("昨天是%d年%d月%d日n",ptr->tm_year + 1900,ptr->tm_mon + 1,ptr->tm_mday);
117 }

? 實(shí)現(xiàn)在終端顯示現(xiàn)在距新年的天數(shù)的函數(shù):

118 /**********************************************************
119  * 函數(shù)名稱: displaynewyear
120  * 功能描述: 在終端打印距離新年的天數(shù)
121  * 輸入?yún)?shù): 無
122  * 輸出參數(shù): 無
123  * 返 回 值: 無
124  * 2020/05/10         V1.0    yanxni            創(chuàng)建
125 ***********************************************************/
126 void displaynewyear(void){
127     struct tm *ptr;
128     time_t lt,lt2;
129     int date;
130
131     /*獲取日歷時(shí)間*/
132     lt = time(NULL);
133
134     /*轉(zhuǎn)化為本地時(shí)間*/
135     ptr = localtime(<);
136     /*構(gòu)造新年的本地時(shí)間*/
137     ptr->tm_year += 1;
138     ptr->tm_mon = 0;
139     ptr->tm_mday =1;
140     ptr->tm_hour =0;
141     ptr->tm_min =0;
142     ptr->tm_sec =0;
143
144     lt2 = mktime(ptr);
145     date = (lt2-lt)/(24*60*60);
146
147     printf("距離新年還有%d天n",date);
148 }

? 實(shí)現(xiàn)在根據(jù)輸入的出生年代在終端顯示年紀(jì)的函數(shù):

/**********************************************************
151  * 函數(shù)名稱: displayage
152  * 功能描述: 在終端打印年紀(jì)
153  * 輸入?yún)?shù): 出生年代
154  * 輸出參數(shù): 無
155  * 返 回 值: 無
156  * 2020/05/10         V1.0    yanxni            創(chuàng)建
157 ***********************************************************/
158 void displayage(int year){
159     struct tm *ptr;
160     time_t lt;
161
162     /*獲取日歷時(shí)間*/
163     lt = time(NULL);
164
165     /*轉(zhuǎn)化為本地時(shí)間*/
166     ptr = localtime(<);
167
168     printf("你的年齡是:%d歲n",ptr->tm_year +1900 - year  );

審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11124

    瀏覽量

    207927
  • RTC
    RTC
    +關(guān)注

    關(guān)注

    2

    文章

    511

    瀏覽量

    65903
收藏 人收藏

    評論

    相關(guān)推薦

    【PDF】C++ GUI Programming with Qt 4 中文版(第一第十章)目錄版

    C++ GUI Programming with Qt 4 中文版(第一第十章)目錄版附件:
    發(fā)表于 02-28 15:46

    自己編的信號與系統(tǒng)(西安電子科大版)第十章課后答案...

    分享 一下 自己編寫的信號與系統(tǒng)(西安電子科大版)的第十章課后習(xí)題的Matlab程序。
    發(fā)表于 11-21 13:06

    【ALIENTEK 戰(zhàn)艦STM32開發(fā)板】STM32開發(fā)指南--第十章 外部中斷...

      第十章 外部中斷實(shí)驗(yàn)  這一,我們將向大家介紹如何使用STM32的外部輸入中斷。在前面幾章的學(xué)習(xí)中,我們掌握了STM32的IO口最基本的操作。本章我們將介紹如何將STM32的IO口作為外部中斷
    發(fā)表于 01-25 10:23

    《從算法設(shè)計(jì)到硬線邏輯的實(shí)現(xiàn)》中第十章練習(xí)6-在Verilog H...

    在做夏宇聞教材《從算法設(shè)計(jì)到硬線邏輯的實(shí)現(xiàn)》中第十章練習(xí)6-在Verilog HDL中使用函數(shù)按原文編譯總是出錯(cuò),將[3:0]中的3改為大于3的值就沒錯(cuò)了,如[4:0].為什么呢?
    發(fā)表于 11-06 14:14

    理解流水線編程——四位全加器(夏老師書第十章)代碼

    第十章 如何編寫和驗(yàn)證簡單的純組合邏輯模塊關(guān)于這一,我唯一想總結(jié)一下的就是流水線的設(shè)計(jì),書上沒有范例,上網(wǎng)上搜索了一下,關(guān)于4位全加器的流水線設(shè)計(jì)大部分都不正確,后來終于找到了一個(gè)和我理解一樣的人
    發(fā)表于 01-14 21:21

    明德?lián)P視頻分享點(diǎn)撥FPGA課程--第十章 ?GVIM的使用

    第十章GVIM的使用1. GVIM使用2http://yunpan.cn/cjZTiDA9pY56x訪問密碼 c359
    發(fā)表于 11-10 08:59

    《測控電路》習(xí)題完整參考答案(第十章

    《測控電路》習(xí)題完整參考答案(第十章).pdf
    發(fā)表于 05-07 11:43

    【連載】【星光閃電STM32F407開發(fā)板】第十章 窗口看門狗實(shí)驗(yàn)

    第十章 窗口看門狗實(shí)驗(yàn)10.1 實(shí)驗(yàn)?zāi)康谋菊聦W(xué)習(xí)STM32的另一個(gè)看門狗--窗口看門狗的使用。數(shù)據(jù)手冊請參看第19。10.2 實(shí)驗(yàn)簡介窗口看門狗(WWDG)通常被用來監(jiān)測由外部干擾或不可預(yù)見的邏輯
    發(fā)表于 11-04 15:32

    VM虛擬機(jī)搭建Linux常用的命令

    第十章----VM虛擬機(jī)搭建Linux整合Gitlab+Jenkins+Nginx+Tomcat自動(dòng)化部署方案總結(jié)
    發(fā)表于 04-08 10:26

    迅為iMX6ULL開發(fā)板使用手冊資料下載

    實(shí)驗(yàn)第四 C語言實(shí)現(xiàn)LED例程第五 移植官方SDK第六 創(chuàng)建裸機(jī)工程第七 蜂鳴器例程第八 按鍵例程第九
    發(fā)表于 12-02 14:13

    Alpha Linux開發(fā)板相關(guān)資料分享

    第十章 C語言版LED燈實(shí)驗(yàn)–編譯下載都沒問題–燈就是不閃??問題原因分析:在編寫Makefile的時(shí)候,使用了一個(gè)“-O2”的優(yōu)化選項(xiàng),至于為什么不成功,暫不清楚,把此選項(xiàng)去掉以后,實(shí)驗(yàn)o...
    發(fā)表于 12-15 07:38

    【傾心力作!】i.MX8MM嵌入式linux開發(fā)指南+全覆蓋開發(fā)資料

    搭建第四部分 開發(fā)板固件編譯第八 Android編譯環(huán)境搭建第九 Android固件編譯第十章 Linux固件編譯
    發(fā)表于 02-11 10:27

    MATLAB 7.0從入門到精通_第三

    強(qiáng)大的工具M(jìn)atlab7入門到精通第一第十章
    發(fā)表于 12-01 16:03 ?0次下載

    HCIE復(fù)習(xí)資料第十章 特性

    HCIE復(fù)習(xí)資料第十章 特性,HCIE全套復(fù)習(xí)資料
    發(fā)表于 05-10 17:22 ?0次下載

    《測控電路》習(xí)題完整參考答案(第十章

    《測控電路》習(xí)題完整參考答案(第十章
    發(fā)表于 02-14 17:01 ?0次下載