編程中經经常使用到時間表達及轉換的函數,它們都定義在 time.h 庫函數中,在此做一下總結,以方便后續查看使用。

幾個時間概念:

1:Coordinated Universal Time(UTC):

協調世界時,又稱世界標準時間,也即格林威治標準時間(Greenwich Mean Time,GMT),中國內地的時間與UTC得時差為+8,也即UTC+8,美國為UTC-5。

2:Calendar Time:

日歷時間,是用"從一個標準時間點到此時的時間經過的秒數"來暗示的時間。標準時間點對分歧編譯器可能會分歧,但對一個編譯系統來說,標準時間是不變的。一般是暗示距離UTC時間 1970-01-01 00:00:00的秒數。

3:epoch:

時間點。在標準c/c++中是一個整數,用此時的時間和標準時間點相差的秒數(即日歷時間)來暗示。

4:clock tick:

時鐘計時單元(而不叫做時鐘滴答次數),一個時鐘計時單元的時間長短是由cpu控制的,一個clock tick不是cpu的一個時鐘周期,而是c/c++的一個基本計時單位。

time.h 的定義

time.h 頭文件定義了四個變量類型、兩個宏和各種操作日期和時間的函數。

4個變量

size_t 是無符號整數類型,它是 sizeof 關鍵字的結果。
clock_t 這是一個適合存儲處理器時間的類型,類型為unsigned long
time_t 這是一個適合存儲日歷時間類型。
struct tm 這是一個用來保存時間和日期的結構。

tm 結構的定義如下:

struct tm
{
   int tm_sec;         /* 秒,范圍從 0 到 59      */
   int tm_min;         /* 分,范圍從 0 到 59      */
   int tm_hour;        /* 小時,范圍從 0 到 23     */
   int tm_mday;        /* 一月中的第幾天,范圍從 1 到 31    */
   int tm_mon;         /* 月,范圍從 0 到 11(注意)  */
   int tm_year;        /* 自 1900 年起的年數      */
   int tm_wday;        /* 一周中的第幾天,范圍從 0 到 6 */
   int tm_yday;        /* 一年中的第幾天,范圍從 0 到 365   */
   int tm_isdst;       /* 夏令時               */
};

兩個宏

NULL 這個宏是一個空指針常量的值。
CLOCKS_PER_SEC 這個宏暗示每秒的處理器時鐘個數。用于將clock()函數的結果轉化為以秒為單位的量,這個量的具體值是與操作系統相關的,通常為1000。

庫函數

1:clock函數

函數原型: clock_t clock(void)

函數返回:返回clock函數執行起(一般為法式的開頭),處理器時鐘所使用的時間。

函數功能:用來計算法式或法式的某一段的執行時間。

實例

#include<stdio。h>
#include<time.h>

int main()
{
    clock_t start_t,finish_t;
    double total_t = 0;
    int i = 0;
    start_t = clock();
    for(;i<100000;++i)
    {
        //do someting;
    }
    finish_t = clock();
    total_t = (double)(finish_t - start_t) / CLOCKS_PER_SEC;//將時間轉換為秒

    printf("CPU 占用的總時間:%f\n", total_t);
    return 0;
}

2:time函數

函數原型: time_t time(time_t *timer)

參數說明: timer=NULL時得到當前日歷時間(從1970-01-01 00:00:00到現在的秒數),timer=時間數值時,用于設置日歷時間,time_t是一個unsigned long類型。如果 timer不為空,則返回值也存儲在變量 timer中。

函數功能: 得到當前日歷時間或者設置日歷時間

函數返回: 當前日歷時間

實例

#include <stdio.h>
#include <time.h>

int main ()
{
  time_t seconds;

  seconds = time(NULL);
  printf("自 1970-01-01 起的小時數 = %ld\n", seconds/3600);

  return(0);
}

3:asctime函數

函數原型: char* asctime(struct tm * ptr)

函數功能:將結構struct tm * ptr所暗示的時間以字符串暗示

函數返回: 返回的時間字符串格式為:星期,月,日,小時:分:秒,年

參數說明: 結構指針ptr應通過函數localtime()或gmtime()得到

實例

#include <stdio.h>
#include <time.h>

int main()
{
   struct tm t;//更多情況下是通過localtime函數及gmtime函數獲得tm結構

   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;

   printf("%s\n",asctime(&t));

   return(0);
}

4:localtime函數

函數原型: struct tm *localtime(const time_t *timer)

函數功能: 使用 timer 的值來填充 tm 結構。timer 的值被分解為 tm 結構,并用当地時區暗示。

函數返回: 以tm結構表達的時間

實例

#include <stdio。h>
#include <time.h>

int main ()
{
   time_t timer;
   struct tm *Now;

   time( &timer );
   Now = localtime( &timer );
   printf("當前的当地時間和日期:%s", asctime(Now));

   return(0);
}

5:ctime函數

函數原型: char *ctime(const time_t * timer)

函數功能: 將日歷時間參數timer轉換為一個暗示当地當前時間的字符串

函數返回: 返回字符串格式:星期,月,日,小時:分:秒,年

參數說明: timer參數應由函數time獲得,其等價于 astime( localtime(timer) )

實例

#include <stdio。h>
#include <time。h>

int main ()
{
   time_t curtime;
   time(&curtime);
   printf("當前時間 = %s", ctime(&curtime));

   return(0);
}

6:difftime函數

函數原型: double difftime(time_t time2, time_t time1)

函數功能: 得到兩次機器時間差,單位為秒

函數返回: 時間差,單位為秒

參數說明: time1,time2分別暗示兩個分歧的機器時間,該參數應使用time函數獲得

實例

#include <time.h>  
#include <stdio。h>  
int main()  
{  
    time_t first,second;  
    time(&first);  
    sleep(2000);  
    time(&second);
    printf("The difference is: %f seconds",difftime(second,first));  

    return 0;  
}  

7:gmtime函數

函數原型: struct tm *gmtime(time_t *timer)

函數功能: 得到以結構tm暗示的時間信息,并用格林威治標準時間暗示

函數返回: 以結構tm暗示的時間信息指針

參數說明: timer用函數time()得到的時間信息

實例

#include <stdio.h>
#include <time.h>

#define BST (+1)
#define CCT (+8)

int main ()
{

   time_t rawtime;
   struct tm *info;

   time(&rawtime);
   /* 獲取 GMT 時間 */
   info = gmtime(&rawtime );

   printf("當前的世界時鐘:\n");
   printf("倫敦:%2d:%02d\n", (info->tm_hour+BST)%24, info->tm_min);
   printf("中國:%2d:%02d\n", (info->tm_hour+CCT)%24, info->tm_min);

   return(0);
}

8:mktime函數

函數原型:time_t mktime(struct tm *timeptr)

函數功能:把 timeptr 所指向的結構轉換為一個依據当地時區的 time_t 值

函數返回:該函數返回一個 time_t 值,該值對應于以參數傳遞的日歷時間。如果發生錯誤,則返回 -1 值。

實例

#include <stdio.h>
#include <time.h>

int main ()
{
   int ret;
   struct tm info;
   char buffer[80];

   info.tm_year = 2001 - 1900;
   info.tm_mon = 7 - 1;
   info.tm_mday = 4;
   info.tm_hour = 0;
   info.tm_min = 0;
   info.tm_sec = 1;
   info.tm_isdst = -1;

   ret = mktime(&info);
   if( ret == -1 )
   {
       printf("錯誤:不克不及使用 mktime 轉換時間。\n");
   }
   else
   {
      strftime(buffer, sizeof(buffer), "%c", &info );
      print(buffer);
   }

   return(0);
}

9:strftime函數

函數原型: size_t strftime( char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);

函數功能: 根據format指向字符串中格式命令把timeptr中保存的時間信息放在strDest指向的字符串中,最多向 strDest中存放maxsize個字符。

參數說明: 轉化結果存在s中,最多maxsize個字符寫到s中

函數返回: 該函數返回向strDest指向的字符串中放置的字符數(不包含'\0'),如果字符數多于maxsize,函數返回0。

實例

/*format如下:它們是區分大小寫的。
    %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 時區名稱,如果不克不及得到時區名稱則返回空字符。
    %% 百分號
*/
 

#include <stdio.h>
#include <time.h>

int main ()
{
   time_t rawtime;
   struct tm *info;
   char buffer[80];

   time( &rawtime );

   info = localtime( &rawtime );

   strftime(buffer,80,"%Y%m%e_%H%M%S", info);//以年月日_時分秒的形式暗示當前時間
   printf("%s\n", buffer );

   return(0);
}

作者:hmxz2nn

原文:https://blog.csdn.net/hmxz2nn/article/details/77986450