1、理清概念
1.1、日歷時間:
含義:國際標准時間1970年1月1日00:00:00以來經過的秒數。
數據類型:time_t。實際上是long的別名。
1.2、tm結構時間:
含義:結構化存放時間的數據結構,方便查看。ANSI C標准稱使用tm結構的這種時間表示為分解時間(broken-down time)
數據類型:
struct tm
{
int tm_sec; /* 秒數,范圍[0,60] */
int tm_min; /* 分鍾,范圍[0,59] */
int tm_hour; /* 小時,范圍[0,23] */
int tm_mday; /* 日,范圍[1,31] */
int tm_mon; /* 月,范圍[0,11] */
int tm_year; /* 年,從1900年開始的年數,為實際年份-1900 */
int tm_wday; /* 星期,周日為0,范圍[0,6] */
int tm_yday; /* 日,從每年1月1日開始的天數,范圍[0,365] */
int tm_isdst; /* 夏令時標識符,實行夏令時的時候,tm_isdst為正,不實行是為0,不了解情況時為負 */
}
2、時間轉換
2.1、時間轉換函數
以下時間轉換函數在time.h中定義 :
(1) time_t time(time_t *calptr);
功能:返回當前日期和時間。
參數:若calptr不為空,則返回的時間值也存放在calptr指向的單元內。
返回值:若成功則返回時間值,不成功則返回-1。
(2) struct tm * gmtime(const time_t *calptr);
功能:將日歷時間轉成國際標准時間的年、月、日、時、分、秒、周日。
參數:日歷時間。
返回值:指向struct tm時間的指針。
(3) struct tm * localtime(const time_t *calptr);
功能:將日歷時間轉成本地時間(考慮到本地時區和夏時制標志)。
參數:日歷時間。
返回值:指向struct tm時間的指針。
(4) time_t mktime(struct tm *tmptr);
功能:將時間結構數據轉換成經過的秒數。
參數:tm結構時間。
返回值:日歷時間。
(5) char *asctime(const struct tm *tmptr);
功能:將時間結構數據轉換為相應的字符串(英文簡寫形式)。
參數:tm結構數據。
返回值:時間字符串。
(6) char *ctime(const time_t *calptr);
功能:將日歷時間轉成字符串。
參數:日歷時間。
返回值:時間字符串。
(7) size_t strftime(char *restrict but, size_t maxsize,
const char *restrict format,
const struct tm *restrict tmptr);
功能:將時間結構數據轉成格式化字符串。
參數:buf存放格式化的結果。maxsize為buf的長度(該長度需要保證能夠存放字符串以及一個null終止符)。
format為格式化參數,類似printf的格式化。tmptr指向一個tm結構的時間數據。
返回值:若buf能夠保存結構則返回存入數組的字符數(不包括null終止符),否則返回0。
2.2、轉換關系圖為:
(圖中以虛線表示的四個函數localtime、mktime、ctime和strftime都受到環境變量TZ的影響)
3、strftime的轉換說明
| 格式 |
說明 |
實例 |
| %a |
縮寫的星期名 |
Thu |
| %A |
全星期名 |
Thursday |
| %b |
縮寫的月名 |
Aug |
| %B |
全月名 |
August |
| %c |
日期和時間 |
Thu Aug 23 14:55:02 2001 |
| %C |
年/100 [00,99] |
20 |
| %d |
十進制表示的每月的第幾天 [01,31] |
16 |
| %D |
月/天/年 [MM/DD/YY] |
06/16/12 |
| %e |
十進制表示的每月的第幾天 ,一位數前加空格[1,31] |
10 |
| %F |
年-月-日 [YYYY-MM-DD] |
2012-06-16 |
| %g |
ISO 8601使用基於周的年的后兩位數字 |
12 |
| %G |
ISO 8601使用基於周的年 |
2012 |
| %h |
簡寫的月份名 ,與%b相同 |
Aug |
| %H |
24小時制的小時 [00,23] |
14 |
| %I |
12小時制的小時 [01,12] |
02 |
| %j |
每年的第幾天 [001,366] |
235 |
| %m |
十進制的月 [01,12] |
08 |
| %M |
分鍾 [00,59] |
55 |
| %n |
換行符 |
|
| %p |
AM/PM |
PM |
| %r |
本地時間:(12時制) |
11:01:23 AM |
| %R |
與“%H:%M”相同 |
11:01 |
| %S |
秒 [00,60] |
02 |
| %t |
水平制表符 |
|
| %T |
與“%H:%M:%S”相同 |
11:01:23 |
| %u |
ISO 8601的星期,星期一為1,[1,7] |
2 |
| %U |
周數 ,以周日為一周開始 [00,53] |
33 |
| %V |
ISO 8601周數 [01,53] |
07 |
| %w |
星期,星期天為0. [0,6] |
4 |
| %W |
周數,以星期一為一周開始 [00,53] |
34 |
| %x |
標准日期 |
06/16/12 |
| %X |
標准時間 |
14:55:02 |
| %y |
年份的后兩位數字 [00,99] |
12 |
| %Y |
年 |
2012 |
| %z |
ISO 8601格式的UTC偏移量 |
-0500 |
| %Z |
時區名 |
EST |
| %% |
百分號 |
% |
4、舉例
代碼:
- #include<stdio.h>
- #include<time.h>
- int main()
- {
- //獲取當前日歷時間
- time_t t;
- t = time(&t);
- printf("the current time of seconds:[%d], string is:[%s]\n",t, ctime(&t));
- //日歷時間轉成本地tm結構時間
- struct tm* tm_t = localtime(&t);
- char buf[100];
- strftime(buf, 100,"%F %T",tm_t);
- printf("get struct tm tm_t from seconds is:[%s]\n", buf);
- //tm結構時間轉成日歷時間
- time_t t1 = mktime(tm_t);
- printf("get seconds from struct tm:[%d]\n",t);
- //自定義tm結構時間
- struct tm tm_t1;
- tm_t1.tm_year=2012-1900;
- tm_t1.tm_mon=0;
- tm_t1.tm_mday=16;
- tm_t1.tm_hour=0;
- tm_t1.tm_sec=0;
- tm_t1.tm_min=0;
- strftime(buf, 100,"%F %T",&tm_t1);
- printf("the struct tm tm_t1 is:[%s]\n", buf);
- }
結果:
the current time of seconds:[1339819819], string is:[Fri Jun 15 21:10:19 2012
]
get struct tm tm_t from seconds is:[2012-06-15 21:10:19]
get seconds from struct tm:[1339819819]
the struct tm tm_t1 is:[2012-01-16 00:00:00]
]
get struct tm tm_t from seconds is:[2012-06-15 21:10:19]
get seconds from struct tm:[1339819819]
the struct tm tm_t1 is:[2012-01-16 00:00:00]
說明:
1、ctime得到的字符串有換行符
2、tm結構的tm_year為從1900開始的年數
2、tm結構的tm_mon為0時表示1月
