成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C語言操作時間函數,實現定時執行某個任務小程序

開發 后端
時間操作函數在實際項目開發中會經常用到,最近做項目也正好用到就正好順便整理一下。

 [[345952]]

時間操作函數在實際項目開發中會經常用到,最近做項目也正好用到就正好順便整理一下。

時間概述

 

 


由上圖可知:

 

 

1.通過系統調用函數time()可以從內核獲得一個類型為time_t的1個值,該值叫calendar時間,即從1970年1月1日的UTC時間從0時0分0妙算起到現在所經過的秒數。而該時間也用于紀念UNIX的誕生。

2.函數gmtime()、localtime()可以將calendar時間轉變成struct tm結構體類型變量中。通過該結構體成員可以很方便的得到當前的時間信息。我們也可以通過函數mktime將該類型結構體的變量轉變成calendar時間。

  1. struct tm{ 
  2.  int tm_sec;/*秒數*/ 
  3.  int tm_min; /*分鐘*/ 
  4.  int tm_hour;/*小時*/ 
  5.  int tm_mday;/*日期*/ 
  6.  int tm_mon; /*月份*/ 
  7.  int tm_year; /*從1990年算起至今的年數*/ 
  8.  int tm_wday; /*星期*/ 
  9.  int tm_yday; /*從今年1月1日算起至今的天數*/ 
  10.  int tm_isdst; /*日光節約時間的旗標*/ 
  11. }; 

3.asctime()和ctime()函數產生形式的26字節字符串,這與date命令的系統默認輸出形式類似:Tue Feb 10 18:27:38 2020/n/0.

4.strftime()將一個struct tm結構格式化為一個字符串。

常用時間函數及舉例

1、time函數

  1. 頭文件:time.h 
  2. 函數定義:time_t time (time_t *t) 
  3. 說明: 
  4.  返回從1970年1月1日的UTC時間從0時0分0妙算起到現在所經過的秒數。 

舉例如下:

  1. #include<stdio.h> 
  2. #include<time.h> 
  3. int main(){ 
  4.  time_t timep; 
  5.   
  6.  long seconds = time(&timep); 
  7.  printf("%ld\n",seconds); 
  8.  printf("%ld\n",timep); 
  9.  return 0; 

輸出:

有興趣的同學可以計算下,從1970年1月1日0時0分0秒到現在經歷了多少秒。

 

附:time_t 一路追蹤發現就是從long類型經過不斷的typedef ,#define定義過來的。

2、ctime函數

  1. 定義:char *ctime(const time_t *timep); 
  2. 說明:將參數所指的time_t結構中的信息轉換成真實世界的時間日期表示方法,然后將結果以字符串形式返回。 
  3. 注意這個是本地時間。 

舉例如下:

  1. #include <stdio.h> 
  2. #include<time.h> 
  3. int main(void) { 
  4.  time_t timep; 
  5.   
  6.  time(&timep); 
  7.  printf("%s\n",ctime(&timep)); 
  8.  return 0; 

輸出:

 

3、gmtime函數

  1. 定義:struct tm *gmtime(const time_t *timep); 
  2. 說明:將參數timep所指的time_t結構中的信息轉換成真實世界所使用的時間日期表示方法,然后將結果由結構tm返回。此函數返回的時間日期未經時區轉換,而是UTC時間。 

舉例如下:

  1. #include <stdio.h> 
  2. #include<time.h> 
  3.   
  4. int main(void) { 
  5.  char *wday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; 
  6.   
  7.  time_t timep; 
  8.  struct tm *p; 
  9.   
  10.  time(&timep); 
  11.  p = gmtime(&timep); 
  12.  printf("%d/%d/%d ",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday); 
  13.  printf("%s %d:%d:%d\n",wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec); 
  14.  return 0; 

輸出:

 

4、 strftime函數

  1. #include <time.h>  
  2. 定義:   
  3. size_t strftime(char *s, size_t max, const char *format,const struct tm *tm); 
  4. 說明: 
  5. 類似于snprintf函數,我們可以根據format指向的格式字符串,將struct tm結構體中信息輸出到s指針指向的字符串中,最多為max個字節。當然s指針指向的地址需提前分配空間,比如字符數組或者malloc開辟的堆空間。 
  6. 其中,格式化字符串各種日期和時間的詳細的確切表示方法有如下多種,我們可以根據需要來格式化各種各樣的含時間字符串。 
  7.     %a 星期幾的簡寫 
  8.     %A 星期幾的全稱 
  9.     %b 月分的簡寫 
  10.     %B 月份的全稱 
  11.     %c 標準的日期的時間串 
  12.     %C 年份的前兩位數字 
  13.     %d 十進制表示的每月的第幾天 
  14.     %D 月/天/年 
  15.     %e 在兩字符域中,十進制表示的每月的第幾天 
  16.     %F 年-月-日 
  17.     %g 年份的后兩位數字,使用基于周的年 
  18.     %G 年分,使用基于周的年 
  19.     %h 簡寫的月份名 
  20.     %H 24小時制的小時 
  21.     %I 12小時制的小時 
  22.     %j 十進制表示的每年的第幾天 
  23.     %m 十進制表示的月份 
  24.     %M 十時制表示的分鐘數 
  25.     %n 新行符 
  26.     %p 本地的AM或PM的等價顯示 
  27.     %r 12小時的時間 
  28.     %R 顯示小時和分鐘:hh:mm 
  29.     %S 十進制的秒數 
  30.     %t 水平制表符 
  31.     %T 顯示時分秒:hh:mm:ss 
  32.     %u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0) 
  33.     %U 第年的第幾周,把星期日做為第一天(值從0到53) 
  34.     %V 每年的第幾周,使用基于周的年 
  35.     %w 十進制表示的星期幾(值從0到6,星期天為0) 
  36.     %W 每年的第幾周,把星期一做為第一天(值從0到53) 
  37.     %x 標準的日期串 
  38.     %X 標準的時間串 
  39.     %y 不帶世紀的十進制年份(值從0到99) 
  40.     %Y 帶世紀部分的十制年份 
  41.     %z,%Z 時區名稱,如果不能得到時區名稱則返回空字符。 
  42.     %% 百分號 
  43. 返回值: 
  44. 成功的話返回格式化之后s字符串的字節數,不包括null終止字符,但是返回的字符串包括null字節終止字符。否則返回0,s字符串的內容是未定義的。值得注意的是,這是libc4.4.4以后版本開始的。對于一些的老的libc庫,比如4.4.1,如果給定的max較小的話,則返回max值。即返回字符串所能容納的最大字節數。 

舉例如下:

  1.  1 #include <stdio.h> 
  2.  2 #include <time.h> 
  3.  3  
  4.  4 #define BUFLEN 255 
  5.  5 int main(int argc, char **argv) 
  6.  6 { 
  7.  7     time_t t = time( 0 );    
  8.  8     char tmpBuf[BUFLEN];    
  9.  9                                                                              
  10. 10     strftime(tmpBuf, BUFLEN, "%Y%m%d%H%M%S", localtime(&t)); //format date a 
  11. 11     printf("%s\n",tmpBuf); 
  12. 12     return 0; 
  13. 13 } 

執行結果如下:

輸出結果表示YYYYmmDDHHMMSS

 

5、 asctime函數

  1. 定義: 
  2. char *asctime(const struct tm *timeptr); 
  3. 說明: 
  4.  將參數timeptr所指的struct tm結構中的信息轉換成真實時間所使用的時間日期表示方法,結果以字符串形態返回。與ctime()函數不同之處在于傳入的參數是不同的結構。 
  5. 返回值: 
  6.  返回的也是UTC時間。 

舉例如下:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include<time.h> 
  4. int main(void) { 
  5.  time_t timep; 
  6.   
  7.  time(&timep); 
  8.  printf("%s\n",asctime(gmtime(&timep))); 
  9.  return EXIT_SUCCESS; 

輸出:

 

6、 localhost函數

  1. struct tm *localhost(const time_t *timep); 
  2. 取得當地目前的時間和日期 

舉例如下:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include<time.h> 
  4.   
  5. int main(void) { 
  6.  char *wday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; 
  7.  time_t timep; 
  8.  struct tm *p; 
  9.   
  10.  time(&timep); 
  11.  p = localtime(&timep); 
  12.  printf("%d/%d/%d ",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday); 
  13.  printf("%s %d:%d:%d\n",wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec); 
  14.  return EXIT_SUCCESS; 

輸出:

 

7、mktime函數

  1. 定義:time_t mktime(struct tm *timeptr); 
  2. 說明: 
  3.  用來將參數timeptr所指的tm結構數據轉換成從1970年1月1日的UTC時間從0時0分0妙算起到現在所經過的秒數。 

舉例如下:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include<time.h> 
  4.   
  5. int main(void) { 
  6.  time_t timep; 
  7.  struct tm *p; 
  8.   
  9.  time(&timep); 
  10.  printf("time():%ld\n",timep); 
  11.  p = localtime(&timep); 
  12.  timep = mktime(p); 
  13.  printf("time()->localtime()->mktime():%ld\n",timep); 
  14.  return EXIT_SUCCESS; 

輸出:

 

8、 gettimeofday函數

  1. 定義: 
  2. int gettimeofday(struct timeval *tv,struct timezone *tz); 
  3. 說明: 
  4.  把目前的時間由tv所指的結構返回,當地時區信息則放到有tz所指的結構中, 

結構體timeval 定義如下:

  1. struct timeval{ 
  2.  long tv_sec; /*秒*/ 
  3.  long tv_usec; /*微秒*/ 
  4. }; 

結構體timezone定義如下:

  1. struct timezone{ 
  2.  int tz_minuteswest; /*和greenwich時間差了多少分鐘*/ 
  3.  int tz_dsttime; /*日光節約時間的狀態*/ 

舉例如下:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include<time.h> 
  4. #include<sys/time.h> 
  5.   
  6. int main(void) { 
  7. struct timeval tv; 
  8. struct timezone tz; 
  9. gettimeofday(&tv,&tz); 
  10. printf("tv_sec :%d\n",tv.tv_sec); 
  11. printf("tv_usec: %d\n",tv.tv_usec); 
  12. printf("tz_minuteswest:%d\n",tz.tz_minuteswest); 
  13. printf("tz_dsttime:%d\n",tz.tz_dsttime); 
  14. return EXIT_SUCCESS; 

輸出:

 

 

綜合實驗

現在我們利用這些時間函數,來實現一個定時執行某個任務得功能。

功能

  1. 程序運行時要記錄當前日志文件的最后修改時間;
  2. 每個10秒鐘就檢查下log文件是否被修改,如果沒有被修改就休眠10秒鐘;
  3. 如果log文件被修改了,就將當前的日志文件拷貝成備份文件,備份文件名字加上當前時間;
  4. 通過curl發送給ftp服務器;
  5. 刪除備份文件,重復步驟2。

程序流程圖如下:

 

在這里插入圖片描述

 

函數功能介紹

init()

首先記錄當前log文件時間,并記錄到全局變量last_mtime中。

check_file_change()讀取文件最后修改時間,并和last_mtime進行比較,如果相同就返回0,不同就返回1.

file_name_add_time()將當前的日志文件拷貝成備份文件,備份文件名字加上當前時間。

stat()

得到對應文件的屬性信息,存放到struct stat結構體變量中。

運行截圖:

第一步:

 

因為log文件沒有被修改過,所以程序不會上傳。

 

第二步:手動輸入字符串 yikoulinux 到日志文件 t.log中。

 

第三步:因為文件發生了改變,所以打印“file updated”,同時可以看到curl上傳文件的log信息。


以下是FTP服務器的根目錄,可以看到,上傳的日志文件:t-2020-7-26-1-19-45.log。

 

 

 

 

【補充】

1.配置信息,直接在代碼中寫死,通常應該從配置文件中讀取,為方便讀者閱讀,本代碼沒有增加該功能;

2.FTP服務器搭建,本文沒有說明,相關文件比較多,大家可以自行搜索,一口君用的是File zilla;

 

3.通常這種需要長時間運行的程序,需要設置成守護進程,本文沒有添加相應功能,讀者可以自行搜索。如果強烈要求可以單開一篇詳細介紹。

4.代碼中time的管理函數,請讀者自行搜索相關文章。

5.curl也提供了相關的函數庫curl.lib,如果要實現更靈活的功能可以使用對應的api。

之所以先把文件拷貝成備份文件,主要是考慮其他模塊隨時可能修改日志文件,起到一定保護作用。

代碼如下

代碼如下:

  1. /*************************************************** 
  2.            Copyright (C)  公眾號: 一口linux   
  3. ***************************************************/ 
  4. #include <sys/stat.h> 
  5. #include <stdio.h> 
  6. #include <stdlib.h> 
  7. #include <unistd.h> 
  8. #include <time.h> 
  9.   
  10. typedef struct stat ST; 
  11. unsigned long last_mtime; 
  12.  
  13. /*用戶名密碼暫時寫死,實際應該保存在配置文件*/ 
  14. char name[32]="user"
  15. char pass[32] ="123456"
  16. char ip[32]     ="192.168.43.117"
  17. char filename[32]="t.log"
  18. char dstfile[256]  ={0}; 
  19.  
  20. int init(void) 
  21.  //準備結構體 
  22.  ST status; 
  23.   
  24.  //調用stat函數 
  25.  int res = stat(filename,&status); 
  26.  if(-1 == res) 
  27.  { 
  28.   perror("error:open file fail\n"); 
  29.   return 0; 
  30.  } 
  31.  last_mtime = status.st_mtime; 
  32.  printf("init time:%s \n",ctime(&last_mtime)); 
  33.  return 1; 
  34.   
  35. int  check_file_change(void) 
  36.  //準備結構體 
  37.  ST status; 
  38.   
  39.  //調用stat函數 
  40.  int res = stat(filename,&status); 
  41.  if(-1 == res) 
  42.  { 
  43.   perror("error:open file fail\n"); 
  44.   return 0; 
  45.  } 
  46. // printf("old:%s new:%s",ctime(&last_mtime),ctime(&status.st_mtime)); 
  47.  if(last_mtime == status.st_mtime) 
  48.  { 
  49.   printf("file not change\n"); 
  50.   return 0; 
  51.  }else
  52.   printf("file updated\n");  
  53.   last_mtime = status.st_mtime; 
  54.   return 1; 
  55.  } 
  56.  
  57. void file_name_add_time(void) 
  58.  ST status; 
  59.  time_t t;   
  60.  struct tm *tblock;  
  61.  char cmd[1024]={0}; 
  62.    
  63.  t = time(NULL); 
  64.  tblock = localtime(&t); 
  65.   
  66.  sprintf(dstfile,"t-%d-%d-%d-%d-%d-%d.log"
  67.   tblock->tm_year+1900, 
  68.   tblock->tm_mon, 
  69.   tblock->tm_mday, 
  70.   tblock->tm_hour, 
  71.   tblock->tm_min, 
  72.   tblock->tm_sec); 
  73.  sprintf(cmd,"cp %s %s",filename,dstfile); 
  74. // printf("cdm=%s\n",cmd); 
  75.  system(cmd); 
  76. int main(void) 
  77.  
  78.  char cmd[1024]={0}; 
  79.  
  80.  init(); 
  81.  while(1) 
  82.  {  
  83.   if(check_file_change() == 1) 
  84.   { 
  85.    file_name_add_time(); 
  86.    sprintf(cmd,"curl -u %s:%s ftp://%s/ -T %s",name,pass,ip,dstfile); 
  87.  //  printf("cdm=%s\n",cmd); 
  88.    system(cmd); 
  89.    unlink(dstfile); 
  90.   } 
  91.   sleep(10);  
  92.  } 

本文轉載自微信公眾號「 一口Linux」,可以通過以下二維碼關注。轉載本文請聯系 一口Linux公眾號。

 

責任編輯:武曉燕 來源: 一口Linux
相關推薦

2012-02-07 13:31:14

SpringJava

2024-01-22 00:35:00

C++函數開發

2009-09-21 09:57:15

linux進程cron

2022-07-26 08:02:33

Android微信程序

2010-03-11 19:16:32

Python語言

2022-08-15 15:43:29

Linuxcron

2010-02-05 15:59:26

C++函數重載

2023-09-14 12:35:28

寄存器

2021-10-14 15:34:48

C語言字符串函數

2024-11-04 16:01:01

2010-06-09 15:15:34

MySQL定時執行

2020-12-21 07:31:23

實現單機JDK

2024-12-27 08:24:55

2010-07-15 14:54:51

at命令crontab定時執行任務

2024-11-25 15:00:00

C#定時任務開發

2019-08-28 07:45:45

數據存儲層多線程

2021-09-07 13:15:01

語言return 1return 0

2023-12-19 08:09:06

Python定時任務Cron表達式

2022-03-28 08:31:29

線程池定時任務

2022-08-05 13:38:08

C語言庫函數printf()
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 自拍偷拍欧美 | a级在线免费观看 | 国产成人av一区二区三区 | 伊人无码高清 | 日韩一级免费电影 | 国产不卡视频 | 荷兰欧美一级毛片 | 精品视频一区二区三区 | 一区二区三区四区五区在线视频 | 五月婷婷丁香 | 精品国产18久久久久久二百 | 中文字幕 在线观看 | www久久久| 欧美操操操 | 综合精品久久久 | 久久久久国产一区二区三区 | 日韩视频专区 | 日韩综合在线 | av中文字幕在线观看 | 国产伦精品一区二区三区照片91 | 亚洲精品国产电影 | 精品国产99 | 综合在线视频 | 日本三级全黄三级a | 亚洲综合热| 国产精品久久久av | 午夜一区二区三区在线观看 | 欧美一二三 | av一区二区在线观看 | av免费看片 | 午夜影院黄| 一区二区免费在线 | 成人黄色av| 一区二区三区亚洲 | 日韩在线免费视频 | 一二区视频| 日韩喷潮| 久久草在线视频 | 国内精品久久久久久影视8 最新黄色在线观看 | 日本久久网 | 欧美精品一区二区三区四区 在线 |