unix環境C編程之日期時間轉換


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、舉例
 
代碼:
[cpp]  view plain copy
 
  1. #include<stdio.h>  
  2. #include<time.h>  
  3.   
  4. int main()  
  5. {  
  6.   //獲取當前日歷時間  
  7.   time_t t;  
  8.   t = time(&t);  
  9.   printf("the current time of seconds:[%d], string is:[%s]\n",t, ctime(&t));  
  10.   
  11.  //日歷時間轉成本地tm結構時間  
  12.   struct tm* tm_t = localtime(&t);  
  13.   char buf[100];  
  14.   strftime(buf, 100,"%F %T",tm_t);   
  15.   printf("get struct tm tm_t from seconds is:[%s]\n", buf);  
  16.   
  17.   //tm結構時間轉成日歷時間  
  18.   time_t t1 = mktime(tm_t);  
  19.   printf("get seconds from struct tm:[%d]\n",t);  
  20.   
  21.   //自定義tm結構時間  
  22.   struct tm tm_t1;  
  23.   tm_t1.tm_year=2012-1900;  
  24.   tm_t1.tm_mon=0;  
  25.   tm_t1.tm_mday=16;  
  26.   tm_t1.tm_hour=0;  
  27.   tm_t1.tm_sec=0;  
  28.   tm_t1.tm_min=0;  
  29.   strftime(buf, 100,"%F %T",&tm_t1);   
  30.   printf("the struct tm tm_t1 is:[%s]\n", buf);  
  31.   
  32. }  


結果:
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]
 
說明:
1、ctime得到的字符串有換行符
2、tm結構的tm_year為從1900開始的年數
2、tm結構的tm_mon為0時表示1月


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM