LINUX下時間類API


(1)常用的時間相關的API和C庫函數有9個:time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday有9個:
(2)time系統調用返回當前時間以秒為單位的距離1970-01-01 00:00:00 +0000(UTC)過去的秒數。這個time內部就是用jiffies換算得到的秒數。其他函數基本都是圍繞着time來工作的。
(3)gmtime和localtime會把time得到的秒數變成一個struct tm結構體表示的時間。區別是gmtime得到的是國際時間,而localtime得到的是本地(指的是你運行localtime函數的程序所在的計算機所設置的時區對應的本地時間)時間。mktime用來完成相反方向的轉換(struct tm到time_t)
(4)如果從struct tm出發想得到字符串格式的時間,可以用asctime或者strftime都可以。(如果從time_t出發想得到字符串格式的時間用ctime即可)
(5)gettimeofday返回的時間是由struct timeval和struct timezone這兩個結構體來共同表示的,其中timeval表示時間,而timezone表示時區。settimeofday是用來設置當前的時間和時區的。
(6)總結:不管用哪個系統調用,最終得到的時間本質上都是一個時間(這個時間最終都是從kernel中記錄的jiffies中計算得來的),只不過不同的函數返回的時間的格式不同,精度不同。

 

 

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <string.h>
int main(void)
{
    
    time_t tNow = 0;
    struct tm tmNow;
    char buf[100];
    struct timeval tv={0};
    struct timezone tz ={0};
    int ret = -1;
    //tNow = time(NULL);
    time(&tNow);
    if( tNow < 0)
    {
        perror("time");
        return -1;
    }    
    printf("time: %ld .\n",((tNow/(60*60*24*365))+1970));
    
    printf("ctime: =%s ",ctime(&tNow));
    
    memset(&tmNow, 0 , sizeof(tmNow));
    
    gmtime_r(&tNow,&tmNow);
    printf("gmtime: %d 年%d 月 %d 日%d 時 %d 分 %d 秒 \n",tmNow.tm_year+1900,tmNow.tm_mon+1,tmNow.tm_mday,tmNow.tm_hour+8,tmNow.tm_min,tmNow.tm_sec);
    
    memset(&tmNow, 0 , sizeof(tmNow));
    localtime_r(&tNow,&tmNow);
    printf("localtime: %d 年%d 月 %d 日%d 時 %d 分 %d 秒 \n",tmNow.tm_year+1900,tmNow.tm_mon+1,tmNow.tm_mday,tmNow.tm_hour,tmNow.tm_min,tmNow.tm_sec);
    
    
    ////asctime
    printf("asctime: %s",asctime(&tmNow));
    
    //strftime
    memset(buf,0,sizeof(buf));
    strftime(buf,sizeof(buf),"%Y-%m-%d, %H-%M-%S",&tmNow);
    printf("strftime:[%s]\n",buf);

    //gettimeofday
    gettimeofday(&tv,&tz);
    printf("s=%ld,us=%ld\n",tv.tv_sec,tv.tv_usec);
    
    return 0;
}

 

1、time
(1)time能得到一個當前時間距離標准起點時間1970-01-01 00:00:00 +0000(UTC)過去了多少秒

2、ctime
(1)ctime可以從time_t出發得到一個容易觀察的字符串格式的當前時間。
(2)ctime好處是很簡單好用,可以直接得到當前時間的字符串格式,直接打印來看。壞處是ctime的打印時間格式是固定的,沒法按照我們的想法去變。
(3)實驗結果可以看出ctime函數得到的時間是考慮了計算機中的本地時間的(計算機中的時區設置)

3、gmtime和localtime
(1)gmtime獲取的時間中:年份是以1970為基准的差值,月份是0表示1月,小時數是以UTC時間的0時區為標准的小時數(北京是東8區,因此北京時間比這個時間大8)
(2)猜測localtime和gmtime的唯一區別就是localtime以當前計算機中設置的時區為小時的時間基准,其余一樣。實踐證明我們的猜測是正確的。


4、mktime
(1)從OS中讀取時間時用不到mktime的,這個mktime是用來向操作系統設置時間時用的。
5、asctime
(1)asctime得到一個固定格式的字符串格式的當前時間,效果上和ctime一樣的。區別是ctime從time_t出發,而asctime從struct tm出發。

6、strftime
(1)asctime和ctime得到的時間字符串都是固定格式的,沒法用戶自定義格式
(2)如果需要用戶自定義時間的格式,則需要用strftime。

7、gettimeofday和settimeofday
(1)前面講到的基於time函數的那個系列都是以秒為單位來獲取時間的,沒有比秒更精確的時間。
(2)有時候我們程序希望得到非常精確的時間(譬如以us為單位),這時候就只能通過gettimeofday來實現了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM