想实现一个功能,首先通过搜索字符串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格式才能确定前面的日期,我想问的就是这个解析方法,谢谢!

解决方案 »

  1.   

     substr(字符串,1,4)=年  substr(字符串,6,2)=月
      

  2.   

    如果格式是'yyyymmdd hh24miss'或者'hh24miss yy/mon/dd'呢,格式有很多的啊...
      

  3.   

    晕死,我要实现的就是解析出时间,当然需要把各种情况都考虑到了,这样才能保证程序功能的完整性!自己写了一段代码,请多多指教
    //入口参数: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;
    }