Linux與時間相關的結構體及相關用法

?

1. Linux下與時間有關的結構體
????????struct timeval
???????{ ?
???????????int tv_sec; ?
???????????int tv_usec; ?
???????}; ?
???????其中tv_sec是由凌晨開始算起的秒數,tv_usec則是微秒(10E-6 second)。 ?

???????struct timezone
???????{ ?
???????????int tv_minuteswest; ?
???????????int tv_dsttime; ?
???????}; ?
???????tv_minuteswest是格林威治時間往西方的時差,tv_dsttime則是時間的修正方式。 ?

???????struct timespec ?
???????{ ?
???????????long int tv_sec; ?
???????????long int tv_nsec; ?
???????}; ?
???????tv_nsec是nano second(10E-9 second)。 ?

???????struct tm ?
???????{ ?
???????????int tm_sec; ?
???????????int tm_min; ?
???????????int tm_hour; ?
???????????int tm_mday; ?
???????????int tm_mon; ?
???????????int tm_year; ?
???????????int tm_wday; ?
???????????int tm_yday; ?
???????????int tm_isdst; ?
???????}; ?
???????tm_sec表「
」數,在[0,61]之間,多出來的兩秒是用來處理跳秒問題用的。 ?
????????tm_min表「
」數,在[0,59]之間。 ?
???????tm_hour表「
」數,在[0,23]之間。 ?
???????tm_mday表「
本月第幾日
」,在[1,31]之間。 ?
???????tm_mon表「
本年第幾月
」,在[0,11]之間。 ?
???????tm_year要加1900表示那一年。 ?
???????tm_wday表「
本第幾日
」,在[0,6]之間。 ?
???????tm_yday表「
本年第幾日
」,在[0,365]之間,閏年有366日。 ?
???????tm_isdst表是否為「
日光節約時間
」。 ?

???????struct ?itimerval
???????{
?????????struct ?timeval it_interval;
?????????struct ?timeval it_value;
???????};
???????it_interval成員表示間隔計數器的初始值,而it_value成員表示間隔計數器的當前值。

??????? 2.獲得當前時間
???????在所有的UNIX下,都有個time()的函數 ?
??????time_t time(time_t *t);
??????這個函數會傳回從epoch開始計算起的秒數,如果t是non-null,它將會把時間值填入t中。 ?

???????對某些需要較高精準度的需求,Linux提供了gettimeofday()。 ?
??????int gettimeofday(struct timeval * tv,struct timezone *tz); ?
??????int settimeofday(const struct timeval * tv,const struct timezone *tz); ?

??????struct tm格式時間函數 ?

??????struct tm * gmtime(const time_t * t); ?
??????轉換成格林威治時間。有時稱為GMT或UTC。 ?

??????struct tm * localtime(const time_t *t); ?
??????轉換成本地時間。它可以透過修改TZ環境變數來在一臺機器中,不同使用者表示不同時間。 ?

??????time_t mktime(struct tm *tp); ?
??????轉換tm成為time_t格式,使用本地時間。 ?

??????tme_t timegm(strut tm *tp); ?
??????轉換tm成為time_t格式,使用UTC時間。 ?

??????double difftime(time_t t2,time_t t1); ?
??????計算秒差。 ?


??????3.文字時間格式函數 ?

??????char * asctime(struct tm *tp); ?
??????char * ctime(struct tm *tp); ?
??????這兩個函數都轉換時間格式為標準UNIX時間格式。 ?
??????Mon May 3 08:23:35 1999 ?

??????ctime一率使用當地時間,asctime則用tm結構內的timezone資訊來表示。 ?

??????size_t strftime(char *str,size_t max,char *fmt,struct tm *tp); ?
??????strftime有點像sprintf,其格式由fmt來指定。 ?

??????%a : 本第幾天名稱,縮寫。 ?
??????%A : 本第幾天名稱,全稱。 ?
??????%b : 月份名稱,縮寫。 ?
??????%B : 月份名稱,全稱。 ?
??????%c : 與ctime/asctime格式相同。 ?
??????%d : 本月第幾日名稱,由零算起。 ?
??????%H : 當天第幾個小時,24小時制,由零算起。 ?
??????%I : 當天第幾個小時,12小時制,由零算起。 ?
??????%j : 當年第幾天,由零算起。 ?
??????%m : 當年第幾月,由零算起。 ?
??????%M : 該小時的第幾分,由零算起。 ?
??????%p : AM或PM。 ?
??????%S : 該分鐘的第幾秒,由零算起。 ?
??????%U : 當年第幾,由第一個日開始計算。 ?
??????%W : 當年第幾,由第一個一開始計算。 ?
??????%w : 當第幾日,由零算起。 ?
??????%x : 當地日期。 ?
??????%X : 當地時間。 ?
??????%y : 兩位數的年份。 ?
??????%Y : 四位數的年份。 ?
??????%Z : 時區名稱的縮寫。 ?
??????%% : %符號。 ?

??????char * strptime(char *s,char *fmt,struct tm *tp); ?
??????如同scanf一樣,解譯字串成為tm格式。 ?

??????%h : 與%b及%B同。 ?
??????%c : 讀取%x及%X格式。 ?
??????%C : 讀取%C格式。 ?
??????%e : 與%d同。 ?
??????%D : 讀取%m/%d/%y格式。 ?
??????%k : 與%H同。 ?
??????%l : 與%I同。 ?
??????%r : 讀取"%I:%M:%S %p"格式。 ?
??????%R : 讀取"%H:%M"格式。 ?
??????%T : 讀取"%H:%M:%S"格式。 ?
??????%y : 讀取兩位數年份。 ?
??????%Y : 讀取四位數年份。 ?

??????下面舉一個小例子,說明如何獲得系統當前時間:
??????????time_t now;
??????????struct tm ?*timenow;
??????????char strtemp[255];
??????
??????????time(&now);
??????????timenow = localtime(&now);
??????????printf("recent time is : %s \n", asctime(timenow));

asctime(將時間和日期以字符串格式表示)

?

相關函數

time,ctime,gmtime,localtime

表頭文件

#include<time.h>

定義函數

char * asctime(const struct tm * timeptr);

函數說明

asctime()將參數timeptr所指的tm結構中的信息轉換成真實世界所使用的時間日期表示方法,然后將結果以字符串形態返回。此函數已經由時區轉換成當地時間,字符串格式為:“Wed Jun 30 21:49:08 1993\n”

返回值

若再調用相關的時間日期函數,此字符串可能會被破壞。此函數與ctime不同處在于傳入的參數是不同的結構。

附加說明

返回一字符串表示目前當地的時間日期。

范例

#include <time.h>
main()
{
time_t timep;
time (&timep);
printf(“%s”,asctime(gmtime(&timep)));
}

執行

Sat Oct 28 02:10:06 2000

ctime(將時間和日期以字符串格式表示)

相關函數

time,asctime,gmtime,localtime

表頭文件

#include<time.h>

定義函數

char *ctime(const time_t *timep);

函數說明

ctime()將參數timep所指的time_t結構中的信息轉換成真實世界所使用的時間日期表示方法,然后將結果以字符串形態返回。此函數已經由時區轉換成當地時間,字符串格式為“Wed Jun 30 21 :49 :08 1993\n”。若再調用相關的時間日期函數,此字符串可能會被破壞。

返回值

返回一字符串表示目前當地的時間日期。

范例

#include<time.h>
main()
{
time_t timep;
time (&timep);
printf(“%s”,ctime(&timep));
}

執行

Sat Oct 28 10 : 12 : 05 2000

gettimeofday(取得目前的時間)

相關函數

time,ctime,ftime,settimeofday

表頭文件

#include <sys/time.h>
#include <unistd.h>

定義函數

int gettimeofday ( struct timeval * tv , struct timezone * tz )

函數說明

gettimeofday()會把目前的時間有tv所指的結構返回,當地時區的信息則放到tz所指的結構中。
timeval結構定義為:
struct timeval{
long tv_sec;
long tv_usec;
};
timezone 結構定義為:
struct timezone{
int tz_minuteswest;
int tz_dsttime;
};
上述兩個結構都定義在/usr/include/sys/time.h。tz_dsttime 所代表的狀態如下
DST_NONE
DST_USA
DST_AUST
DST_WET
DST_MET
DST_EET
DST_CAN
DST_GB
DST_RUM
DST_TUR
DST_AUSTALT

返回值

成功則返回0,失敗返回-1,錯誤代碼存于errno。附加說明EFAULT指針tv和tz所指的內存空間超出存取權限。

范例

#include<sys/time.h>
#include<unistd.h>
main(){
struct timeval tv;
struct timezone tz;
gettimeofday (&tv , &tz);
printf(“tv_sec; %d\n”, tv,.tv_sec) ;
printf(“tv_usec; %d\n”,tv.tv_usec);
printf(“tz_minuteswest; %d\n”, tz.tz_minuteswest);
printf(“tz_dsttime, %d\n”,tz.tz_dsttime);
}

執行

tv_sec: 974857339
tv_usec:136996
tz_minuteswest:-540
tz_dsttime:0

gmtime(取得目前時間和日期)

相關函數

time,asctime,ctime,localtime

表頭文件

#include<time.h>

定義函數

struct tm*gmtime(const time_t*timep);

函數說明

gmtime()將參數timep 所指的time_t 結構中的信息轉換成真實世界所使用的時間日期表示方法,然后將結果由結構tm返回。
結構tm的定義為
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
int tm_sec 代表目前秒數,正常范圍為0-59,但允許至61秒
int tm_min 代表目前分數,范圍0-59
int tm_hour 從午夜算起的時數,范圍為0-23
int tm_mday 目前月份的日數,范圍01-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 日光節約時間的旗標
此函數返回的時間日期未經時區轉換,而是UTC時間。

返回值

返回結構tm代表目前UTC 時間

范例

#include <time.h>
main(){
char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_t timep;
struct tm *p;
time(&timep);
p=gmtime(&timep);
printf(“%d%d%d”,(1900+p->tm_year), (1+p->tm_mon),p->tm_mday);
printf(“%s%d;%d;%d\n”, wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
}

執行

2000/10/28 Sat 8:15:38

localtime(取得當地目前時間和日期)

相關函數

time, asctime, ctime, gmtime

表頭文件

#include<time.h>

定義函數

struct tm *localtime(const time_t * timep);

函數說明

localtime()將參數timep所指的time_t結構中的信息轉換成真實世界所使用的時間日期表示方法,然后將結果由結構tm返回。結構tm的定義請參考gmtime()。此函數返回的時間日期已經轉換成當地時區。

返回值

返回結構tm代表目前的當地時間。

范例

#include<time.h>
main(){
char *wday[]={“Sun”,”Mon”,”Tue”,”Wed”,”Thu”,”Fri”,”Sat”};
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
printf (“%d%d%d ”, (1900+p->tm_year),( l+p->tm_mon), p->tm_mday);
printf(“%s%d:%d:%d\n”, wday[p->tm_wday],p->tm_hour, p->tm_min, p->tm_sec);
}

執行

2000/10/28 Sat 11:12:22

mktime(將時間結構數據轉換成經過的秒數)

相關函數

time,asctime,gmtime,localtime

表頭文件

#include<time.h>

定義函數

time_t mktime(strcut tm * timeptr);

函數說明

mktime()用來將參數timeptr所指的tm結構數據轉換成從公元1970年1月1日0時0分0 秒算起至今的UTC時間所經過的秒數。

返回值

返回經過的秒數。

范例


#include<time.h>
main()
{
time_t timep;
strcut tm *p;
time(&timep);
printf(“time() : %d \n”,timep);
p=localtime(&timep);
timep = mktime(p);
printf(“time()->localtime()->mktime():%d\n”,timep);
}

執行

time():974943297
time()->localtime()->mktime():974943297

settimeofday(設置目前時間)

相關函數

time,ctime,ftime,gettimeofday

表頭文件

#include<sys/time.h>
#include<unistd.h>

定義函數

int settimeofday ( const struct timeval *tv,const struct timezone *tz);

函數說明

settimeofday()會把目前時間設成由tv所指的結構信息,當地時區信息則設成tz所指的結構。詳細的說明請參考gettimeofday()。注意,只有root權限才能使用此函數修改時間。

返回值

成功則返回0,失敗返回-1,錯誤代碼存于errno。

錯誤代碼

EPERM 并非由root權限調用settimeofday(),權限不夠。
EINVAL 時區或某個數據是不正確的,無法正確設置時間。

time(取得目前的時間)

相關函數

ctime,ftime,gettimeofday

表頭文件

#include<time.h>

定義函數

time_t time(time_t *t);

函數說明

此函數會返回從公元1970年1月1日的UTC時間從0時0分0秒算起到現在所經過的秒數。如果t 并非空指針的話,此函數也會將返回值存到t指針所指的內存。

返回值

成功則返回秒數,失敗則返回((time_t)-1)值,錯誤原因存于errno中。

范例

#include<time.h>
mian()
{
int seconds= time((time_t*)NULL);
printf(“%d\n”,seconds);
}



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

int
main ()
{
? struct tm tm, tm2;
? char buf[255];
? time_t t1, t2;

? strptime ("Thu Feb 5 13:12:18 EST 2009", "%a %b %d %H:%M:%S EST %Y", &tm);
? strptime ("Fri Feb 6 13:11:18 EST 2009", "%a %b %d %H:%M:%S EST %Y", &tm2);

? t1 = mktime(&tm);
? t2 = mktime(&tm2);
? printf("TIME: %ld, %ld, %ld\n", t2, t1, t2-t1);
? return 0;
}?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法(3)-數據結構-數組和字符串

leetcode-explore-learn-數據結構-數據結構-數組和字符串1. 一維數組1.0 概況1.1 尋找數組的中心索引1.2 搜索插入位置1.3 合并區間1.4 至少是其他數字兩倍大的最大數1.5 加一2. 二維數組2.1旋轉矩陣本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處…

redis的入門/原理/實戰大總結

入門 Redis是一款基于鍵值對的NoSQL數據庫&#xff0c;它的值支持多種數據結構&#xff1a; 字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。 ? Redis將所有的數據都存放在內存中&#xff0c;所以它的讀寫性能十分驚人&#xff0c;用作數…

創建與打開IPC通道的POSIX和SYSTEM V方法

先說&#xff30;&#xff2f;&#xff33;&#xff29;&#xff38;的吧&#xff1a; mq_open&#xff0c;sem_open&#xff0c;shm_open著三個函數用于創建或者打開一個IPC通道。 由此可見&#xff0c;消息隊列的讀寫權限是任意的&#xff0c;然而信號燈就沒有&#xff0c;…

算法(4)-leetcode-explore-learn-數據結構-數組2

leetcode-explore-learn-數據結構-數組21.簡述2.例題2.1 二維數組的對角線遍歷2.2 螺旋遍歷2.3 楊輝三角本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card/ar…

軟件測試基礎知識

第一章 1.1 軟件測試背景知識和發展史 互聯網公司職位架構&#xff1a;產品 運營 技術 市場 行政軟件測試&#xff1a;使用人工或自動化手段&#xff0c;來運行或測試某個系統的過程&#xff0c;其目的在于檢驗它是否滿足規定的需求或弄清預期結果與實際結果之間的差別&#…

key_t IPC鍵和ftok函數詳解和剖析

統建立IPC通訊&#xff08;如消息隊列、共享內存時&#xff09;必須指定一個ID值。通常情況下&#xff0c;該id值通過ftok函數得到。 ftok原型如下&#xff1a; key_t ftok( char * fname, int id ) fname就時你指定的文件名(該文件必須是存在而且可以訪問的)&#xff0c;id是子…

算法(5)-leetcode-explore-learn-數據結構-字符串

leetcode-explore-learn-數據結構-數組3-字符串1.簡述2.例題2.1 二進制求和2.2實現strStr()2.3最長公共前綴本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card…

ipcs命令查看管道,消息隊列,共享內存

修改消息隊列大小&#xff1a; root&#xff1a;用戶&#xff1a; /etc/sysctl.conf kernel.msgmnb 4203520 #kernel.msgmnb 3520 kernel.msgmni 2878 保存后需要執行 sysctl -p ,然后重建所有消息隊列 ipcs -q : 顯示所有的消息隊列 ipcs -qt : 顯示消息隊列的創建時…

Jmeter-基礎篇

常用壓力測試工具對比 1、loadrunner 性能穩定&#xff0c;壓測結果及細粒度大&#xff0c;可以自定義腳本進行壓測&#xff0c;但是太過于重大&#xff0c;功能比較繁多 2、apache ab(單接口壓測最方便) 模擬多線程并發請求,ab命令對發出負載的計算機…

消息隊列接口API(posix 接口和 system v接口)

消息隊列 posix API消息隊列&#xff08;也叫做報文隊列&#xff09;能夠克服早期unix通信機制的一些缺點。信號這種通信方式更像\"即時\"的通信方式&#xff0c;它要求接受信號的進程在某個時間范圍內對信號做出反應&#xff0c;因此該信號最多在接受信號進程的生命…

算法(6)-leetcode-explore-learn-數據結構-數組字符串的雙指針技巧

leetcode-explore-learn-數據結構-數組4-雙指針技巧1.雙指針技巧--適用情形11.1概述1.2 例題1.2.1 反轉字符串1.2.2數組拆分1.2.3 兩數之和22雙指針技巧-適用情形22.1概述2.2例題2.2.1 移除元素2.2.2 最大連續1的個數2.2.3長度最小的子數組本系列博文為leetcode-explore-learn子…

POSIX和SYSTEM的消息隊列應該注意的問題

首先看看POSIX的代碼&#xff1a; 1.posix_mq_server.c #include <mqueue.h> #include <sys/stat.h> #include <string.h> #include <stdio.h> #define MQ_FILE "/mq_test" #define BUF_LEN 128 int main() { mqd_t mqd; char b…

算法(7)-leetcode-explore-learn-數據結構-數組-小結

leetcode-explore-learn-數據結構-數組5-小結1.概述2.例題2.1旋轉數組2.2 楊輝三角22.3翻轉字符串里的單詞2.4反轉字符串中的單詞32.5 刪除排序數組中的重復項2.6 移動零本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官…

fcntl函數詳解

功能描述&#xff1a;根據文件描述詞來操作文件的特性。 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); [描述] fcntl()針對(文件)描述符提供控…

使用nohup讓程序永遠后臺運行

使用nohup讓程序永遠后臺運行 Unix/Linux下一般比如想讓某個程序在后臺運行&#xff0c;很多都是使用 & 在程序結尾來讓程序自動運行。比如我們要運行mysql在后臺&#xff1a; /usr/local/mysql/bin/mysqld_safe --usermysql &但是加入我們很多程序并不象mysqld一樣做…

算法(8)-leetcode-explore-learn-數據結構-鏈表

leetcode-explore-learn-數據結構-鏈表11.概述1.1 鏈表插入操作1.2 鏈表刪除操作2.設計鏈表本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-list/所…

Mysql索引優化實例講解

MYSQL描述&#xff1a;一個文章庫&#xff0c;里面有兩個表&#xff1a;category和article。category里面有10條分類數據。article里面有20萬條。article里面有一個"article_category"字段是與category里的"category_id"字段相對應的。article表里面已經把…

給自己的VIM配置

編輯 .vimrc 文件如下&#xff1a; filetype plugin on "autocmd Filetype cpp,c,java,cs set omnifunccppcomplete#Complete set nu set nocp set nobackup let g:C_AuthorName gaoke let g:C_AuthorRef gaoke let g:C_Email gaoketaomee.…

shell一文入門通

簡單來說“Shell編程就是對一堆Linux命令的邏輯化處理”。 W3Cschool 上的一篇文章是這樣介紹 Shell的 hello world 學習任何一門編程語言第一件事就是輸出HelloWord了&#xff01;下面我會從新建文件到shell代碼編寫來說下Shell 編程如何輸出Hello World。 (1)新建一個文件…

算法(9)--兩個數的最大公約數

兩個數的最大公約數1.輾轉相除法求解兩個數的最大公約數2.更相減損術求解兩個數的最大公約數3.不嚴格理解1.輾轉相除法求解兩個數的最大公約數 輾轉相除法&#xff1a;兩個正整數a和b&#xff08;a>b&#xff09;的最大公約數等于a除以b的余數與b 之間的最大公約數。–如果…