Linux time
time
asctime
ctime
gmtime
localtime
mktime
strptime
函数原型: char strptime(const char buf,const char format,struct tm timeptr)
format字符串的构建方式和strftime的format字符串完全一样。strptime返回一个指针,指向转换过程处理的最后一个字符后面的那个字符。
strftime
函数原型:size_t strftime(char s,size_t maxsize,char format,const struct tm *timeptr)
strftime函数对timeptr指向的tm结构所代表的时间和日期进行格式编排,其结果放在字符串s中。该字符串的长度被设置为(最少)maxsize个字符。格式字符串format用来对写入字符串的字符进行控制,它包含着将被传送到字符串里去的普通字符以及编排时间和日期格式的转换控制符。转换控制符见下表
转换控制符 | 说明 |
---|---|
%a | 星期几的简写形式 |
%A | 星期几的全称 |
%b | 月份的简写形式 |
%B | 月份的全称 |
%c | 日期和时间 |
%d | 月份中的日期,0-31 |
%H | 小时,00-23 |
%I | 12进制小时钟点,01-12 |
%j | 年份中的日期,001-366 |
%m | 年份中的月份,01-12 |
%M | 分,00-59 |
%p | 上午或下午 |
%s | 秒,00-60 |
%u | 星期几,1-7 |
%w | 星期几,0-6 |
%x | 当地格式的日期 |
%X | 当地格式的时间 |
%y | 年份中的最后两位数,00-99 |
%Y | 年 |
%Z | 地理时区名称 |
Example:
#include
#include
#include
int main(){
struct tm *tm_ptr,timestruct;
time_t the_time;
char *buf[256];
(void) time(&the_time);
tm_ptr=localtime(&the_time);
strftime(buf,256,"%A %d %B,%I:%S %p",tm_ptr);
printf("strftime gives: %s\n",buf);
strcpy(buf,"Sat 26 July 2003,17:53 will do fine");
printf("calling strptime with: %s\n",buf);
tm_ptr+×truct;
result=strptime(buf,"%a %d %b %Y,%R",tm_ptr);
printf("strptime consumed up to: %s\n",result);
printf("strptime gives:\n");
printf("date: %02d/%02d/%02d\n",tm_ptr->tm_year%100,tm_ptr->tm_mon+1,tm_ptr->tm_mday);
printf("time: %02d:%02d\n",tm_ptr->tm_hour,tm_ptr->tm_min);
exit(0);
}
Output:
strftime gives:Sunday 06 June, 11:55 AM
calling strptime with:Sat 26 July 2003,17:53 will do fine
strptime consumed up to:will do fine
strptime gives:
date: 03/07/26
time: 17:53
clock
clock 函数的返回值类型是clock_t,它除以CLOCKS_PER_SEC来得出时间,一般用两次clock函数来计算进程自身运行的时间.
ANSI clock有三个问题:
- 如果超过一个小时,将要导致溢出.
- 函数clock没有考虑CPU被子进程使用的情况.
- 也不能区分用户空间和内核空间.
所以clock函数在linux系统上变得没有意义.
times
原型如下:
clock_t times(struct tms *buf);
tms结构体如下:
strace tms{
clock_t tms_utime;
clock_t tms_stime;
clock_t tms_cutime;
clock_t tms_cstime;
}
tms_utime记录的是进程执行用户代码的时间.
tms_stime记录的是进程执行内核代码的时间.
tms_cutime记录的是子进程执行用户代码的时间.
tms_cstime记录的是子进程执行内核代码的时间.
getimeofday
gettimeofday()可以获得当前系统的时间,是一个绝对值
原型如下:
int gettimeofday ( struct timeval tv , struct timezone tz )
timeval结型体的原型如下:
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
};
所以它可以精确到微秒
clock_gettime
在POSIX1003.1中增添了这个函数,它的原型如下:
int clock_gettime(clockid_t clk_id, struct timespec *tp);
它有以下的特点:
- 它也有一个时间结构体:timespec ,timespec计算时间次数的单位是十亿分之一秒.
strace timespec{ time_t tv_sec; long tv_nsec; }
clockid_t是确定哪个时钟类型.
CLOCK_REALTIME: 标准POSIX实时时钟
CLOCK_MONOTONIC: POSIX时钟,以恒定速率运行;不会复位和调整,它的取值和CLOCK_REALTIME是一样的.
CLOCK_PROCESS_CPUTIME_ID和CLOCK_THREAD_CPUTIME_ID是CPU中的硬件计时器中实现的.
Summary
clock()函数的精确度是10毫秒(ms)
times()函数的精确度是10毫秒(ms)
gettimofday()函数的精确度是微秒(μs)
clock_gettime()函数的计量单位为十亿分之一,也就是纳秒(ns)
Example:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/times.h>
#include <sys/time.h>
#define WAIT for(i=0;i<298765432;i++);
#define MILLION 1000000
int
main ( int argc, char *argv[] )
{
int i;
long ttt;
clock_t s,e;
struct tms aaa;
s=clock();
WAIT;
e=clock();
printf("clock time : %.12f\n",(e-s)/(double)CLOCKS_PER_SEC);
long tps = sysconf(_SC_CLK_TCK);
s=times(&aaa);
WAIT;
e=times(&aaa);
printf("times time : %.12f\n",(e-s)/(double)tps);
struct timeval tvs,tve;
gettimeofday(&tvs,NULL);
WAIT;
gettimeofday(&tve,NULL);
double span = tve.tv_sec-tvs.tv_sec + (tve.tv_usec-tvs.tv_usec)/1000000.0;
printf("gettimeofday time: %.12f\n",span);
struct timespec tpstart;
struct timespec tpend;
clock_gettime(CLOCK_REALTIME, &tpstart);
WAIT;
clock_gettime(CLOCK_REALTIME, &tpend);
double timedif = (tpend.tv_sec-tpstart.tv_sec)+(tpend.tv_nsec-tpstart.tv_nsec)/1000000000.0;
printf("clock_gettime time: %.12f\n", timedif);
return EXIT_SUCCESS;
}
gcc -lrt test4.c -o test4
debian:/tmp# ./test4
clock time : 1.190000000000
times time : 1.180000000000
gettimeofday time: 1.186477000000
clock_gettime time: 1.179271718000