UNIX中的时间函数

2014-07-29 12:46:57   最后更新: 2014-07-29 12:46:57   访问数量:762




UNIX内核提供的基本时间服务是计算自国际标准时间公元1970年1月1日00:00:00以来经过的秒数,以数据类型time_t表示

 

time_t time(time_t * timer);

 

定义于time.h头文件中,调用成功返回时间值,否则返回-1

 

如果参数不为空,则时间值同时被存储在timer所指向的地址作为返回

 

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

 

定义于sys/time.h头文件中,总是返回0

 

提供了更高的时间分辨率(最高为微秒级)

 

tzp唯一的合法值为NULL,使用其他值会产生不确定的结果

struct timeval { time_t tv_sec; //秒 [long int] suseconds_t tv_usec; //微秒 [long int] };

 

 

timeval结构用于存储秒和微秒

 

一旦获得了这种以秒技术的整型时间值后,通常要调用另一个时间函数将其转换为人们可读的日期和时间

1、localtime、gmtime

struct tm *localtime(const time_t *clock); struct tm *gmtime(long *clock);

 

定义于time.h头文件中,返回指向tm结构的指针

 

两个函数 localtime 和 gmtime 将日历时间转换成以年、月、日、时、分、秒、周表示的时间,存储在tm结构中

区别在于,localtime将日历时间转换成本地时间,考虑本地的时区、夏时制等标志,而gmtime将日立时间转换成国际标准时间

struct tm {   int tm_sec; /* 秒–取值区间为[0,59] */   int tm_min; /* 分 - 取值区间为[0,59] */   int tm_hour; /* 时 - 取值区间为[0,23] */   int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */   int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */   int tm_year; /* 年份,其值从1900开始 */   int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */   int tm_yday; /* 从每年的1月1日开始的天数–取值区间为[0,365]*/   int tm_isdst; /* 夏令时标识符,实行夏令时为正。不实行为0,不可用则为负*/   long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/   const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/ };

 

 

2、mktime

time_t mktime(struct tm * timeptr);

 

定义于time.h头文件中,将tm结构体转换为time_t类型的日历时间,出错返回-1

 

3、asctime、ctime

char *asctime(const struct tm *tblock); char *ctime(const time_t *time);

 

返回以null结尾的字符串首地址指针,字符串为常用的26字节字符串:

 

e.g.

Tue Feb 10 18:27:38 2004\n\0

 

4、strftime

size_t strftime ( char *buf, size_t maxsize, const char *format, const struct tm *timeptr );

 

定义于time.h头文件中,如果有空间则返回存入数据的字符数,否则返回0

 

strftime函数与snprintf非常类似,通过format参数控制时间的存储格式:

%a缩写的周名 Tue
%A全周名 Tuesday
%b缩写的月名 Feb
%B全月名 February
%c日期和时间 Tue Feb 10 18:27:38 2004
%C年/100(取值:00-99) 20
%d十进制表示的每月的第几天 10
%D月/天/年 02/10/04
%e在两字符域中,十进制表示的每月的第几天 10
%F年-月-日 2004-02-10
%g年份的后两位数字 04
%G年份 2004
%h简写的月份名 Feb
%H24小时制的小时 18
%I12小时制的小时 06
%j十进制表示的每年的第几天 041
%m十进制表示的月份 02
%M十时制表示的分钟数 27
%n换行符
%p本地的AM或PM的等价显示 PM
%r12小时的时间 06:27:38 PM
%R显示小时和分钟:hh:mm 18:27
%S十进制的秒数 38
%t水平制表符
%T显示时分秒:hh:mm:ss 18:27:38
%u每周的第几天(取值:1-7,周日是7) 2
%U年的第几周(取值:0到53,周日算一周第一天) 06
%VISO 8601周数(取值1-53) 07
%w十进制表示的星期几(取值:0-6,周日是0) 2
%W年的第几周(取值:0到53,周一算一周第一天) 06
%x标准的日期串 02/10/04
%X标准的时间串 18:27:38
%y年的最后两位 04
%Y年份 20
%zISO 8601格式的UTC偏移量 -0500
%Z时区名称,如果不能得到时区名称则返回空字符 EST
%%百分号 %

 

  • 注意,%U、%W、%V之间的区别

 

  • %U:包含该年中第一个星期日的周是第一周
  • %W:包含该年中第一个星期一的周是第一周
  • %V:若某周包含了1月1日,而且包含了其后的另外三天,则该周是该年第一周,否则认为下一周为该年第一周

 

  • localtime、mktime、ctime、strftime四个函数会收到环境变量TZ的影响,如果定义了TZ,则这些函数将使用其值以代替系统默认失去,如果TZ定义为空串,则使用国际标准时间UTC

 






读书笔记      技术帖      linux      unix      c语言      龙潭书斋      时间      apue      unix环境高级编程      time      gettimeofday      localtime      mktime      asctime      ctime      strftime     


京ICP备15018585号