文章目錄
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 類型:長(zhǎng)整型
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í)鐘芯片通過引腳對(duì)外提供時(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ī)這么做,正所謂越簡(jiǎn)單越科學(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í)間,每秒增長(zhǎng)60。后來考慮到如果每秒60個(gè)數(shù)字,則1.1年后時(shí)間值就到達(dá)最大,于是改成以秒為計(jì)數(shù)單位,時(shí)間能表示到68.1年之長(zhǎng),就不在乎起始時(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位的有符號(hào)數(shù)來表示,數(shù)據(jù)取值范圍為-2147483648~2147483647,也就是說時(shí)間最大值只能取到2147483647(秒),換算成年也即2147483647÷365÷24÷60÷60=68.1年,也就是說32位能表示的最長(zhǎng)時(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í)的問題了。現(xiàn)在主流CPU都是64位的,使用64位的數(shù)據(jù)表示時(shí)間也是順其自然的事,用64位的有符號(hào)數(shù)來表示時(shí)間,可以表示到292,277,026,596年12月4日15時(shí)30分08秒,相信我們?cè)僖膊挥贸顣r(shí)間回歸的問題了。
10.2 RTC的操作命令
? 弄清楚了時(shí)間怎么表示之后,Linux是怎么使用和維護(hù)時(shí)間的呢?我們?cè)趺赐ㄟ^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)行較長(zhǎng)時(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ì)再?gòu)腞TC中去獲取或者同步設(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ì)對(duì)日期做更改 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í)間,而是要對(duì)時(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語(yǔ)言涉及中經(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 類型:長(zhǎng)整型
? 一般用來表示從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都可以為空。如果為空則就不返回其對(duì)應(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í)的時(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ù)識(shí)別以百分號(hào)(%)開始的格式命令集合,其格式由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 星期幾的簡(jiǎn)寫 %A 星期幾的全稱 %b 月分的簡(jiǎn)寫 %B 月份的全稱 %c 標(biāo)準(zhǔn)的日期的時(shí)間串 %C 年份的后兩位數(shù)字 %d 十進(jìn)制表示的每月的第幾天 %D 月/天/年 %e 在兩字符域中,十進(jìn)制表示的每月的第幾天 %F 年-月-日 %g 年份的后兩位數(shù)字,使用基于周的年 %G 年分,使用基于周的年 %h 簡(jiǎn)寫的月份名 %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ū)名稱則返回空字符。 %% 百分號(hào)
? 示例:
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 值,該值對(duì)應(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)入程序后,使用不同命令完成不同功能,主要命令見下表:
序號(hào) | 命令 | 功能 | 示例 |
---|---|---|---|
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ù)的使用手冊(cè),然后循環(huán)接收用戶輸入的命令,根據(jù)命令調(diào)用相應(yīng)的函數(shù):
32 //打印使用手冊(cè) 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請(qǐng)輸入命令:"); 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ù): 無(wú) 75 * 輸出參數(shù): 無(wú) 76 * 返 回 值: 無(wú) 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ù): 無(wú) 100 * 輸出參數(shù): 無(wú) 101 * 返 回 值: 無(wú) 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ù): 無(wú) 122 * 輸出參數(shù): 無(wú) 123 * 返 回 值: 無(wú) 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ù): 無(wú) 155 * 返 回 值: 無(wú) 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 ); 審核編輯 黃昊宇
-
Linux
+關(guān)注
關(guān)注
87文章
11320瀏覽量
209833 -
RTC
+關(guān)注
關(guān)注
2文章
541瀏覽量
66707
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論