歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> Unix系統的時間和日期例程

Unix系統的時間和日期例程

日期:2017/2/28 11:26:09   编辑:關於Unix


時間和日期例程
  UNIX內核提供的基本時間服務是國際標准時間公元1970年1月1日00:00:00以來經過的秒數,這種秒數是以數據類型time_t表示的。我們稱它們為日歷時間。日歷時間包括時間和日期。
  UNIX在這方面與其他操作系統的區別是:(a)以國際標准時間而非本地時間計時;(b)可自動進行轉換,例如變換到夏日制;(c)將時間和日期作為一個量值保存。
  time函數返回當前時間和日期。
  在time.h中定義>>>
CODE:#ifndef _TIME_T
#define _TIME_T
typedef long time_t;
#endif

l time_t time(time_t * tp);返回:若成功則為時間值,若出錯則為- 1;
  時間值作為函數值返回。如果參數非null,則時間值也存放在由tp指向的單元內。
  其中四個函數l o c a l t i m e、m k t i m e、c t i m e和s t r f t i m e都受到環境變量T Z的影響。如果定義了T Z,則這些函數將使用其值以代替系統默認時區。如果T Z定義為空串(亦即T Z = ),則使用國際標准時間。
  在很多伯克利類的系統中,time(3)只是一個函數,它調用gettimeofday(2)系統調用。在SVR4中調用stime(2)函數,在伯克利類的系統中調用settimeofday(2)對內核中的當前時間設置初始值。與time和stime函數相比,BSD的gettimeofday和settimeofday提供了更高的分辨率(微秒級)。這對某些應用很重要。
  兩個函數l o c a l t i m e和g m t i m e將日歷時間變換成以年、月、日、時、分、秒、周日表示的時間,並將這些存放在一個t m結構中。
CODE:struct tm { /* a broken-down time */
int tm_sec; /* seconds after the minute: [0, 60] */
int tm_min; /* minutes after the hour: [0, 59] */
int tm_hour; /* hours after midnight: [0, 23] */
int tm_mday; /* day of the month: [1, 31] */
int tm_mon; /* month of the year: [0, 11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday: [0, 6] */
int tm_yday; /* days since January 1: [0, 365] */
int tm_isdst; /* daylight saving time flag: <0, 0, >0 */
};

秒可以超過5 9的理由是可以表示潤秒。注意,除了月日字段,其他字段的值都以0開始。如果夏時制生效,則夏時制標志值為正;如果已非夏時制時間則為0;如果此信息不可用,則為負。
l struct tm * gmtime(const time_t *tp);
l struct tm *localtime(const time_t * tp); 兩個函數返回:指向t m結構的指針
l o c a l t i m e和g m t i m e之間的區別是: l o c a l t i m e將日歷時間變換成本地時間(考慮到本地時區和夏時制標志),而g m t i m e則將日歷時間變換成國際標准時間的年、月、日、時、分、秒、周日。
  函數mktime以本地時間的年、月、日等作為參數,將其變換成t i m e _ t值。
l time_t mktime(struct tm * tp); 返回:若成功則為日歷時間,若出錯則為- 1
  a s c t i m e和c t i m e函數產生形式的2 6字節字符串,a s c t i m e的參數是指向年、月、日等字符串的指針,而c t i m e的參數則是指向日歷時間的指針。這與d a t e ( 1 )命令的系統默認輸出形式類似:
Tue Jan 14 17:49:03 1992\n\0
l char *asctime(const struct tm *t m p t r) ;
l char *ctime(const time_t * c a l p t r) ;兩個函數返回:指向n u l l結尾的字符串
  最後一個時間函數是strftime,它是非常復雜的p r i n t f類的時間值函數。
l size_t strftime(char * buf, size_t smax, const char * format, const struct tm * tp);
  返回:若有空間,則存入數組的字符數,否則為0
  最後一個參數是要格式化的時間值,由一個指向一個年、月、日、時、分、秒、周日時間值的指針說明。格式化結果存放在一個長度為m a x s i z e個字符的b u f數組中,如果b u f長度足以存放格式化結果及一個n u l l終止符,則該函數返回在b u f中存放的字符數(不包括n u l l終止符),否則該函數返回0。
  f o r m a t參數控制時間值的格式。如同p r i n t f函數一樣,變換說明的形式是百分號之後跟一個特定字符。f o r m a t中的其他字符則按原樣輸出。兩個連續的百分號在輸出中產生一個百分號。與p r i n t f函數的不同之處是,每個變換說明產生一個定長輸出字符串,在f o r m a t字符串中沒有字段寬度修飾符。表中列出了2 1種ANSI C規定的變換說明。
格式 說明 例子
% a 縮寫的周日名 T u e
% A 全周日名 T u e s d a y
% b 縮寫的月名 J a n
% B 月全名 J a n u a r y
% c 日期和時間 Tue Jan 14 19:40:30 1992
% d 月日:[01, 31] 1 4
% H 小時(每天2 4小時):[00, 23] 1 9
% I 小時(上、下午各1 2小時): [01, 12] 0 7
% j 年日:[001, 366] 0 1 4
% m 月:[01, 12] 0 1
% M 分:[00, 59] 4 0
% p A M / P M P M
% S 秒:[00, 61] 3 0
% U 星期日周數: [00, 53] 0 2
% w 周日:[ 0 =星期日,6 ] 2
% W 星期一周數: [00, 53] 0 2
% x 日期 0 1 / 1 4 / 9 2
% X 時間 1 9 : 4 0 : 3 0
% y 不帶公元的年:[00, 991] 9 2
% Y 帶公元的年 1 9 9 2
% Z 時區名 M S T
% U是相應日期在該年中所屬周數,包含該年中第一個星期日的周是第一周。% W也是相應日期在該年中所屬的周數,不同的是包含第一個星期一的周為第一周。
Copyright © Linux教程網 All Rights Reserved