Linux下的時間函式以及格式化輸出時間
阿新 • • 發佈:2019-02-06
我們在程式設計中可能會經常用到時間,比如取得系統的時間(獲取系統的年、月、日、時、分、秒,星期等),或者是隔一段時間去做某事,那麼我們就用到一些時間函式。
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
輸出結果:
2017-05-24 22:42:08
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
和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