分享

Unix时间和日期

 astrotycoon 2013-09-03

Unix内核通过计算从1970年1月1日0点0分0秒纪元(UTC)开始经过的秒数来提供的基本时间和日期服务。在用户层,这个值是以time_t(在Unix中以t结尾的数据类型被称作基本系统数据类型,int的定义类型)数据类型标识的,一般被称作日历时间(calendar time),并通过函数time获得当前的值。

time函数原型:

  1. #include <time.h>  
  2. time_t time(time_t *timeptr);  

如果参数timeptr不为NULL的话则返回值也保存在它所指向的内存空间中。发生错误的话返回-1。

当获取这个值后,就可以通过调用其他函数来将它转换成可读的日期和时间,它们之间的关系如下图(来自Unix高级环境编程):


struct tm结构为:

  1. struct tm {          
  2.     int  tm_sec;     // 秒 [0 - 60]  
  3.     int  tm_min;     // 分 [0 - 59]   
  4.     int  tm_hour;    // 小时 [0 - 23]   
  5.     int  tm_mday;    // 一月中的天数 [1 - 31]   
  6.     int  tm_mon;     // 月 [0 - 11]  
  7.     int  tm_year;    // 从1900 年开始过的年数  
  8.     int  tm_wday;    // 星期 [0 - 6]   
  9.     int  tm_yday;    // 一年中的天数 [0 - 365]   
  10.     int  tm_isdst;   // 夏令时标志 <0不可用, 0非夏令时, >0为夏令时  
  11.   };  

localtime、gmtime和mktime的函数原型

  1. #include <time.h>  
  2. struct tm *gmtime(const time_t *calptr);  
  3. struct tm *localtime(const time_t *calptr);  
  4. time_t mktime(struct tm *tmptr);  

localtime函数将日历时间转换成本地时间而购买time则转换为UTC时间,mktime则将本地时间转换为日历时间。

函数ctime和actime分别以time_t和struct tm的指针数据类型为参数,返回可读性很好的时间表示字符串,函数原型为

  1. #include <time.h>  
  2. char *asctime(const struct tm *tmptr);  
  3. char *ctime(const time_t *calptr);  

strftime函数类似于snprintf函数,但它是专用于存储转换时间和日期的,并定义有特定的format,函数原型:

  1. #include <time.h>  
  2. size_t strftime(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr);  
前3个参数和snprintf函数相同,第四个参数为struct tm结构体(通常由time函数获得),具体的format可以通过manpage 3获得。


上述的所有函数只能提供秒级的精度,如果想获得更高的精度,则可以使用函数gettimeofday(微秒级精度)和clock_gettime函数(纳秒级精度)。不过它们都是基于单独的Unix规范和POSIX规范的。

gettimeofday函数原型和相关数据结构

  1. #include <sys/time.h>  
  2. int gettimeofday(struct timeval *restrict tp, void *restrict tzp);  
  3.   
  4. struct timeval {  
  5.            time_t tv_sec;    // 秒  
  6.            long   tv_usec;   // 微秒  
  7. };  
参数tzp在目前单独Unix规范中只能是NULL。


clock_gettime函数:

  1. #include <time.h>  
  2. int clock_gettime(clockid_t clk_id, struct timespec *tp);  
  3.   
  4. struct timespec {  
  5.     time_t tv_sec;  // 秒  
  6.     long    tv_nsec;  // 纳秒  
  7. };  
参数clk_id标识特定的时钟(系统时钟,进程特定时钟,线程特定时钟等),系统时钟所有进程可见。根据系统实现(硬件软件)的不同,获得的精度可能也是不同的,可以通过函数clock_getres获得特定系统的精度,而函数clock_settime则可以设定时钟,具体可从manpage 3获取。

将clk_id置为CLOCK_REALTIME则可以获得当前具体时间(从纪元开始)。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多