想实现一个功能,首先通过搜索字符串to_date( '2007-11-09 02:35:59 ', 'yyyy-mm-dd hh24:mi:ss ')得到日期 2007-11-09 02:35:59放入一个缓存,可是我想从缓存中提取出具体的年、月、日、时、分、秒,由于字符串to_date()中的yyyy-mm-dd hh24:mi:ss格式太多了,所以我得首先通过解析出 yyyy-mm-dd hh24:mi:ss格式才能确定前面的日期,我想问的就是这个解析方法,谢谢!
调试欢乐多
//入口参数:text *p 指向时间字符串的指针;
// text *pp 指向表示时间格式字符串的指针;
//出口参数:struct tm *stime 解析出的具体时间内容;int ParseTimeString(text *p, text *pp, struct tm *stime)
{
int flg = 0, flg1 = 0, year, y, m, d, h, mi, s;
text *pp1, *ppt, *ptmp;
text pt[30], tt[4], tmp[9];
struct tm *local;
time_t t;
memset(pt, 0, 30);
memset(tt, 0, 4);
memset(tmp, 0, 9);
//获取系统当前时间
t = time(NULL);
local = localtime(&t);
year = local->tm_year +1900;
gcvt(year, 4, tt);
pp1 = strchr(pp, '\'');
memcpy(pt, pp, (int)(pp1-pp));
ppt = pt;
memcpy(ppt+(int)(pp1-pp), "\0", 1);
while(1)
{
while(!isalpha(*ppt))
{
ppt++;
if(*ppt == '\0' || *ppt == 'A' || *ppt == 'a' || *ppt == 'P' || *ppt == 'p')
{
flg++;
break;
}
}
if(flg != 0 || *ppt == 'A' || *ppt == 'a' || *ppt == 'P' || *ppt == 'p')
{
break;
}
while(!isalnum(*p))
{
p++;
}
switch(*ppt)
{
case 'y':
pp1 = ppt;
while(*ppt == 'y')
{
ppt++;
}
memcpy(tmp, p, (int)(ppt-pp1));
y = atoi(tmp);
memset(tmp, 0, 9);
if(y<=9)
{
gcvt(y, 1, tmp);
tt[3] = tmp[0];
y = atoi(tt);
}
else if(y>9 && y<=99)
{
gcvt(y, 2, tmp);
tt[2] = tmp[0];
tt[3] = tmp[1];
y = atoi(tt);
}
else if(y<=999)
{
gcvt(y, 3, tmp);
tt[1] = tmp[0];
tt[2] = tmp[1];
tt[3] = tmp[2];
y = atoi(tt);
}
p+=(int)(ppt-pp1);
memset(tmp, 0, 9);
break;
case 'm':
if(*(ppt+1) == 'm')
{
memcpy(tmp, p, 2);
m = atoi(tmp);
if(m<1 || m>12)
{
printf("month error\n");
return -1;
}
p+=2;
ppt+=2;
}
else if(*(ppt+1) == 'i')
{
memcpy(tmp, p, 2);
mi = atoi(tmp);
if(mi<1 || mi>59)
{
printf("minute error\n");
return -1;
}
p+=2;
ppt+=2;
}
//"month"
else if(*(ppt+3) == 't')
{
pp1 = p;
while(isalpha(*pp1))
{
pp1++;
}
memcpy(tmp, p, (int)(pp1-p));
ptmp = tmp;
if(strcasecmp(ptmp, "January") == 0)
{
m = 1;
p+=strlen("January");
}
else if(strcasecmp(ptmp, "February") == 0)
{
m = 2;
p+=strlen("February");
}
else if(strcasecmp(ptmp, "March") == 0)
{
m = 3;
p+=strlen("March");
}
else if(strcasecmp(ptmp, "April") == 0)
{
m = 4;
p+=strlen("April");
}
else if(strcasecmp(ptmp, "May") == 0 )
{
m = 5;
p+=strlen("May");
}
else if(strcasecmp(ptmp, "June") == 0)
{
m = 6;
p+=strlen("June");
}
else if(strcasecmp(ptmp, "July") == 0)
{
m = 7;
p+=strlen("July");
}
else if(strcasecmp(ptmp, "August") == 0)
{
m = 8;
p+=strlen("August");
}
else if(strcasecmp(ptmp, "September") == 0)
{
m = 9;
p+=strlen("September");
}
else if(strcasecmp(ptmp, "October") == 0)
{
m = 10;
p+=strlen("October");
}
else if(strcasecmp(ptmp, "November") == 0)
{
m = 11;
p+=strlen("November");
}
else
{
m = 12;
p+=strlen("December");
}
ppt += 5;
}
//"mon"
else
{
pp1 = p;
while(isalpha(*pp1))
{
pp1++;
}
memcpy(tmp, p, (int)(pp1-p));
ptmp = tmp;
if(strcasecmp(ptmp, "Jan") == 0)
{
m = 1;
}
else if(strcasecmp(ptmp, "Feb") == 0)
{
m = 2;
}
else if(strcasecmp(ptmp, "Mar") == 0)
{
m = 3;
}
else if(strcasecmp(ptmp, "Apr") == 0)
{
m = 4;
}
else if(strcasecmp(ptmp, "May") == 0 )
{
m = 5;
}
else if(strcasecmp(ptmp, "Jun") == 0)
{
m = 6;
}
else if(strcasecmp(ptmp, "Jul") == 0)
{
m = 7;
}
else if(strcasecmp(ptmp, "Aug") == 0)
{
m = 8;
}
else if(strcasecmp(ptmp, "Sep") == 0)
{
m = 9;
}
else if(strcasecmp(ptmp, "Oct") == 0)
{
m = 10;
}
else if(strcasecmp(ptmp, "Nov") == 0)
{
m = 11;
}
else
{
m = 12;
}
p+=3;
ppt+=3;
}
memset(tmp, 0, 9);
break;
case 'd':
memcpy(tmp, p, 2);
d = atoi(tmp);
if(d<1 || d>31)
{
printf("day error\n");
return -1;
}
p+=2;
ppt+=2;
memset(tmp, 0, 9);
break;
case 'h':
if(atoi(ppt+2) != 24 && (strstr(ppt, "PM") || strstr(ppt, "P.M.") || strstr(ppt, "pm") || strstr(ppt, "p.m.") || strstr(ppt, "Pm") || strstr(ppt, "P.m.") || strstr(ppt, "pM") || strstr(ppt, "p.M.")))
{
memcpy(tmp, p, 2);
h = atoi(tmp);
if(h<1 || h>12)
{
printf("hour error\n");
return -1;
}
h += 12;
}
else
{
memcpy(tmp, p, 2);
h = atoi(tmp);
if(h<1 || h>23)
{
printf("hour error\n");
return -1;
}
}
p+=2;
ppt+=2;
memset(tmp, 0, 9);
break;
case 's':
{
memcpy(tmp, p, 2);
s = atoi(tmp);
if(s<1 || s>59)
{
printf("second error\n");
return -1;
}
}
p+=2;
ppt+=2;
memset(tmp, 0, 9);
break;
}
}
//年
stime->tm_year = y-1900;
stime->tm_mon = m-1;
stime->tm_mday = d;
stime->tm_hour = h;
stime->tm_min = mi;
stime->tm_sec = s; return 0;
}