1. 程式人生 > >Linux下的時間函式以及格式化輸出時間

Linux下的時間函式以及格式化輸出時間

我們在程式設計中可能會經常用到時間,比如取得系統的時間(獲取系統的年、月、日、時、分、秒,星期等),或者是隔一段時間去做某事,那麼我們就用到一些時間函式。
linux下儲存時間常見的有兩種儲存方式,一個是從1970年到現在經過了多少秒,一個是用一個結構來分別儲存年月日時分秒的。

time_t 這種型別就是用來儲存從1970年到現在經過了多少秒。
struct timeval結構,可以更精確,它精確到微妙。

struct timeval
{
   long tv_sec; /*秒*/
   long tv_usec; /*微秒*/
};

而直接儲存年月日的是一個結構:
struct tm
{
   int tm_sec; /*秒,正常範圍0-59, 但允許至61*/
   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; /*從今年1月1日到目前的天數,範圍0-365*/
   int tm_isdst; /*日光節約時間的旗標*/
};

需要特別注意的是,年份是從1900年起至今多少年,而不是直接儲存如2008年,月份從0開始的,0表示一月,星期也是從0開始的, 0表示星期日,1表示星期一。

下面介紹一下我們常用的時間函式:
#include <time.h>


char *asctime(const struct tm* timeptr);
將結構中的資訊轉換為真實世界的時間,以字串的形式顯示。

char *ctime(const time_t *timep);
將timep轉換為真是世界的時間,以字串顯示,它和asctime不同就在於傳入的引數形式不一樣。

double difftime(time_t time1, time_t time2);
返回兩個時間相差的秒數。

int gettimeofday(struct timeval *tv, struct timezone *tz);
返回當前距離1970年的秒數和微妙數,後面的tz是時區,一般傳 NULL。

struct tm* gmtime(const time_t *timep);
將time_t表示的時間轉換為沒有經過時區轉換的UTC時間,是一個struct tm結構指標。

stuct tm* localtime
(const time_t *timep);
和gmtime類似,但是它是經過時區轉換的時間。

time_t mktime(struct tm* timeptr);
將struct tm 結構的時間轉換為從1970年至今的秒數。

time_t time(time_t *t); 
取得從1970年1月1日至今的秒數。

size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);
格式化日期和時間,並輸出到字串s中

舉例:gettimeofday & localtime & strftime
#include <stdio.h>
#include <time.h>
#include <sys/time.h>

int main (void)
{
    struct timeval tv; 
    time_t time;
    char str_t[26] = {0};

    gettimeofday (&tv, NULL);

    time = tv.tv_sec;

    struct tm* p_time = localtime(&time); 
    strftime(str_t, 26, "%Y-%m-%d %H:%M:%S\n", p_time);  

    printf ("%s\n", str_t);
    
    return 0;
}

輸出結果:
2017-05-24 22:42:08