最近有一个webservice的性能测试,在录制脚本的时候发现需要获取本机的UTC时间(与GMT时间是一样的)以及比当前UTC推迟5分钟的时间,格式为2008-05-23T10:05:05Z。
查看帮助后发现有这么几个有用的函数:
time
用法:time( time_t *t)
功能:此函数返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数。如果t并非空指针,此函数也会将返回值存到t指针所指的内存。
返回值:成功,返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。
gmtime
定义函数 struct tm*gmtime(const time_t*timep);
函数说明 gmtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回。结构tm的定义为
#ifndef _TM_DEFINED
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],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
};
#define _TM_DEFINED
#endif
为了得到上面说到的2个时间,用以上函数获取的时间格式只能为2008-5-23T10:5:5Z。可以看到和需要的时间在格式上稍有出入(个位数的时间需要显示为0x),在loadrunner脚本中加入以下代码可以得到需要的时间格式:
typedef long time_t;
struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [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 savings time flag */
#ifdef LINUX
int tm_gmtoff;
const char *tm_zone;
#endif
};
vuser_init()
{
char time_a[21],time_b[21];
char ql_mon[3],ql_mon_b[3],ql_day[3],ql_day_b[3],ql_hour[3],ql_hour_b[3],ql_min[3],ql_min_b[3],ql_sec[3],ql_sec_b[3];
time_t t,l;
struct tm *p;
struct tm *q;
tzset(); //UNIX时间兼容函数
time(&t);
p=(struct tm*)gmtime(&t);
if((1+p->tm_mon) < 10){
sprintf(ql_mon,"0%d",(1+p->tm_mon));
}
else{
sprintf(ql_mon,"%d",(1+p->tm_mon));
}
if(p->tm_mday < 10){
sprintf(ql_day,"0%d",p->tm_mday);
}
else{
sprintf(ql_day,"%d",p->tm_mday);
}
if(p->tm_hour < 10){
sprintf(ql_hour,"0%d",p->tm_hour);
}
else{
sprintf(ql_hour,"%d",p->tm_hour);
}
if(p->tm_min < 10){
sprintf(ql_min,"0%d",p->tm_min);
}
else{
sprintf(ql_min,"%d",p->tm_min);
}
if(p->tm_sec < 10){
sprintf(ql_sec,"0%d",p->tm_sec);
}
else{
sprintf(ql_sec,"%d",p->tm_sec);
}
sprintf(time_a,"%d-%s-%sT%s:%s:%sZ",(1900+p->tm_year),ql_mon,ql_day,ql_hour,ql_min,ql_sec);
lr_message("%s",time_a);
l=t+300;
q=(struct tm*)gmtime(&l);
if((1+q->tm_mon) < 10){
sprintf(ql_mon_b,"0%d",(1+q->tm_mon));
}
else{
sprintf(ql_mon_b,"%d",(1+q->tm_mon));
}
if(q->tm_mday < 10){
sprintf(ql_day_b,"0%d",q->tm_mday);
}
else{
sprintf(ql_day_b,"%d",q->tm_mday);
}
if(q->tm_hour < 10){
sprintf(ql_hour_b,"0%d",q->tm_hour);
}
else{
sprintf(ql_hour_b,"%d",q->tm_hour);
}
if(q->tm_min < 10){
sprintf(ql_min_b,"0%d",q->tm_min);
}
else{
sprintf(ql_min_b,"%d",q->tm_min);
}
if(q->tm_sec < 10){
sprintf(ql_sec_b,"0%d",q->tm_sec);
}
else{
sprintf(ql_sec_b,"%d",q->tm_sec);
}
sprintf(time_b,"%d-%s-%sT%s:%s:%sZ",(1900+q->tm_year),ql_mon_b,ql_day_b,ql_hour_b,ql_min_b,ql_sec_b);
lr_message("%s",time_b);
return 0;
}
这样,当前UTC时间和推迟5分钟的时间分别存储在time_a和time_b这2个字符串中,在脚本的其它地方可以调用。