Record and Summarize

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

注:最好将<time.h>和<sys/time.h>都引入

1、类型声明与结构体声明:
(1)typedef  long  time_t;
  time_t实际是一个长整型。其值表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数。由于time_t类型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分07秒(UTC)。
  UTC时间有时也称为GMT时间,其实UTC和GMT两者几乎是同一概念。它们都是指格林尼治标准时间,只不过UTC的称呼更为正式一点。两者区别在于前者是天文上的概念,而后者是基于一个原子钟。
  time_t记录一个日历时间。日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。
(2)struct tm

struct tm
{
  int tm_sec;            /* Seconds.    [0-59]*/
  int tm_min;            /* Minutes.    [0-59] */
  int tm_hour;            /* Hours.    [0-23] */
  int tm_mday;            /* Day.        [1-31] */
  int tm_mon;            /* Month.    [0-11] */
  int tm_year;            /* Year    - 其值为1900年至今年数  */
  int tm_wday;            /* Day of week.    [0-6] */
  int tm_yday;            /* Days in year.[0-365]    */
  int tm_isdst;            /*夏令时标识符,使用夏令时,tm_isdst为正,不使用夏令时,tm_isdst为0,不了解情况时,tm_isdst为负*/  
  long int tm_gmtoff;     /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/
  const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/
};

ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。
(3)struct timeval

struct timeval
{
    time_t tv_sec;        /* Seconds.  */
    suseconds_t tv_usec;    /* Microseconds.  */
};
//suseconds_t实质上是long类型

(4)struct timespec

struct timespec
{
    time_t tv_sec;        /* Seconds.  */
    long int tv_nsec;        /* Nanoseconds.  */
};

2、time_t time(time_t * timer)
(1)说明
  该函数返回从1970年1月1日00时00分00秒至今(本地时间)所经过的秒数。如果time_t *timer非空指针,函数也会将返回值存到timer指针指向的内存。
(2)返回值
  成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。
(3)亮点
  在生成随机数时,通常用该函数生成种子。
(4)对以下函数的总括:
  1)ctime和asctime只是将时间转换为字符串类型,不用考虑本地时间或是GMT。
  2)gmtime和localtime返回的指针指向的是同一个地址,如果先后调用两个函数,先调用的函数返回的指针指向的地址会被后调用的函数覆盖掉,此时如果同时输出二者返回的数据,会发现数据完全一样,因此,应该调用某个函数后立即处理。
ctime和asctime也存在上述情况,所以应该即时打印或保存。
  3)gmtime和localtime都默认把参数当作本地时间。
  4)mktime是将本地时间转换为本地时间,GMT时间转换为GMT时间。

3、char *ctime(const time_t *time);
(1)说明
  ctime( )将参数time 指向的time_t时间信息转换成实际所使用的时间日期表示方法,并以字符串形式返回。字符串格式为:"Wed Jun 20 21:00:00 2012\n"。
(2)linux下使用时应如下:
  (char *)ctime(&time) ,即要将返回值进行类型转换,还有很多函数也需要这样做。

4、struct tm *gmtime(const time_t *timep)
(1)说明
  gmtime( )将参数timep指向的time_t时间信息转换成以tm结构体表示的GMT时间信息,并以struct tm*指针返回。

5、struct tm *localtime(const time_t *timep);
(1)说明
  localtime( )将参数timep指向的time_t时间信息转换成以tm结构体表示的本地时区时间。

6、time_t mktime(struct tm *p_tm);
(1)说明
  mktime( )将参数p_tm指向的tm结构体数据转换成对应的time_t类型的数据。发生错误时返回-1.
  无论是本地时间还是GMT都可以进行转换。

7、char *asctime(const struct tm *p_tm);
(1)说明
  asctime()将参数p_tm指向的tm结构体数据转换成实际使用的时间日期表示方法,并以字符串形式返回(与ctime函数相同)。字符串格式为:"Wed Jun 20 21:00:00 2012\n"。


8、double difftime(time_t timep1, time_t timep2);
(1)说明
  返回两个time_t型变量之间的时间间隔,即计算两个时刻之间的时间差。它的实现是用timep1-timep2,因此可能是负值。

9、size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timeptr);
(1)说明
将时间格式化。
(2)参数和返回值
我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数,错误返回0。
格式命令列在下面,它们是区分大小写的:

  •   %a 星期几的简写
  •   %A 星期几的全称
  •   %b 月份的简写
  •   %B 月份的全称
  •   %c 标准的日期的时间串
  •   %C 年份的后两位数字
  •   %d 十进制表示的每月的第几天
  •   %D 月/天/年
  •   %e 在两字符域中,十进制表示的每月的第几天
  •   %F 年-月-日
  •   %g 年份的后两位数字,使用基于周的年
  •   %G 年份,使用基于周的年
  •   %h 简写的月份名
  •   %H 24小时制的小时
  •   %I 12小时制的小时
  •   %j 十进制表示的每年的第几天
  •   %m 十进制表示的月份
  •   %M 十时制表示的分钟数
  •   %n 新行符
  •   %p 本地的AM或PM的等价显示
  •   %r 12小时的时间
  •   %R 显示小时和分钟:hh:mm
  •   %S 十进制的秒数
  •   %t 水平制表符
  •   %T 显示时分秒:hh:mm:ss
  •   %u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
  •   %U 第年的第几周,把星期日作为第一天(值从0到53)
  •   %V 每年的第几周,使用基于周的年
  •   %w 十进制表示的星期几(值从0到6,星期天为0)
  •   %W 每年的第几周,把星期一做为第一天(值从0到53)
  •   %x 标准的日期串
  •   %X 标准的时间串
  •   %y 不带世纪的十进制年份(值从0到99)
  •   %Y 带世纪部分的十制年份
  •   %z,%Z 时区名称,如果不能得到时区名称则返回空字符。
  •   %%百分号
posted on 2013-12-30 16:37  zhangjing327  阅读(199)  评论(0编辑  收藏  举报