程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linux C語言時間操作總結

Linux C語言時間操作總結

編輯:關於C語言
 

寫代碼的過程中,經常要使用C標准庫中的一些函數,比如時間相關的函數,每次使用都要去查文檔,雖然經常用,但是也沒有總結過,以至於每次使用時,還是沒有辦法一次搞定,為了搞定這個時間操作的問題,就總結了這麼一篇文章,就是一個總結,以後再寫時間操作相關的代碼時,不查文檔,一次搞定。

涉及到的函數

現在工作的環境都是Linux,對於時間操作,也就是使用C標准庫中的幾個函數,如下所示:

  • time
  • strftime
  • mktime
  • localtime
  • gmtime
  • difftime
  • ctime
  • asctime
  • clock

這些函數對應的頭文件是<ctime>和 <time.h>。這些函數都存在一定的聯系的,如下圖所示:

Linux C時間函數關系圖

我一般怎麼用這幾個函數呢?首先調用time函數獲得一個當前時間距離UTC時間1970年1月1日的秒數,這個函數返回一個time_t類型的值,說白了就是一個整型值;得到這個值以後,我們就可以進行接下來的任何操作了。

  • 轉換成字符串
    轉換成字符串一點問題沒有,調用ctime函數就可以直接搞定;ctime函數會返回例如下述格式的一個字符串:

     

    Wed Feb 13 16:06:10 2013
  • 想得到時間每個字段的值
    我想單獨的得到時間中每個字段的值,比如:年份值、月份值等信息;沒問題。只需要調用localtime或者gmtime函數就可以搞定了(localtime返回本地時間信息;gmtime返回UTC時間信息),localtime或者gmtime函數返回一個struct tm類型的結構體,你要的字段信息都在裡面,去看看吧。
  • 想自定義格式輸出日期
    這個非常簡單,調用strftime就可以搞定了。就像snprintf一樣,非常強大。關於%d%s…這些東西,就看文檔去吧。

代碼示例

看個簡單的代碼示例吧,最感性的還是代碼。

#include <iostream>#include <ctime>using namespace std;int main(){
    time_t rawTime;
    rawTime = time(NULL);
    if (rawTime == -1)
    {
        return 0;
    }

    cout<<"Now is:"<<ctime(&rawTime)<<endl;

    struct tm *timeInfo;
    timeInfo = localtime(&rawTime);
    cout<<"Now is:"<<asctime(timeInfo)<<endl;

    cout<<"Year:"<<timeInfo->tm_year + 1900<<endl;
    cout<<"Month:"<<timeInfo->tm_mon + 1<<endl;
    cout<<"Day:"<<timeInfo->tm_mday<<endl;

    char buff[256] = {0};
    strftime(buff, sizeof(buff) / sizeof(buff[0]), "今天是%Y年%m月%d日", timeInfo);
    cout<<buff<<endl;

    return 0;}

例子太簡單了,不想分析。

注意事項

從文檔中可以看到以下函數的聲明:

  • localtime
  • gmtime
  • ctime
  • asctime

上述四個函數都是返回一個指針類型的值,那麼問題來了,這個指針指向的是哪塊內存呢?

首先需要確定的是,這幾個函數返回的指針指向的內存不是我們開辟或定義的。庫自己開辟的?是的,沒錯,庫自己搞了一塊內存。然後文檔中也詳細的說了,調用這四個函數不是線程安全的,明白了麼?你剛剛得到的struct tm值,可能在另一個線程中被別人修改了。所以,使用之前,想清楚喽!!!

總結

這些小的知識點在日常開發工作中經常會使用到,也是留意最少的地方,而也是這些小地方容易出現問題,不積跬步無以至千裡,只有積累多了,當真的出現問題時,也能從容應對。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved