⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 date_object.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#ifdef KJS_VERBOSE    fprintf(stderr,"KRFCDate_parseDate returned seconds=%d\n",seconds);#endif    if ( seconds == invalidDate )      return Number(NaN);    else      return Number(seconds * 1000.0);  }  else  {    // Found 12/31/2099 on some website -> obviously MM/DD/YYYY    int month = u.substr(0,firstSlash).toULong();    int secondSlash = u.find('/',firstSlash+1);    //fprintf(stdout,"KJS::parseDate firstSlash=%d, secondSlash=%d\n", firstSlash, secondSlash);    if ( secondSlash == -1 )    {      fprintf(stderr,"KJS::parseDate parsing for this format isn't implemented\n%s", u.ascii());      return Number(NaN);    }    int day = u.substr(firstSlash+1,secondSlash-firstSlash-1).toULong();    int year = u.substr(secondSlash+1).toULong();    //fprintf(stdout,"KJS::parseDate day=%d, month=%d, year=%d\n", day, month, year);    struct tm t;    memset( &t, 0, sizeof(t) );#if !APPLE_CHANGES || KWIQ //FIXME: KWIQ: linux mktime limited to 2037    year = (year > 2037) ? 2037 : year; // mktime is limited to 2037 !!!#endif    t.tm_year = (year >= 0 && year <= 99) ? year : year - 1900;    t.tm_mon = month-1; // mktime wants 0-11 for some reason    t.tm_mday = day;    time_t seconds = mktime(&t);    if ( seconds == invalidDate )    {#if !APPLE_CHANGES      fprintf(stderr,"KJS::parseDate mktime returned -1.\n%s", u.ascii());#endif      return Number(NaN);    }    else      return Number(seconds * 1000.0);  }}///// Awful duplication from krfcdate.cpp - we don't link to kdecorestatic unsigned int ymdhms_to_seconds(int year, int mon, int day, int hour, int minute, int second){    unsigned int ret = (day - 32075)       /* days */            + 1461L * (year + 4800L + (mon - 14) / 12) / 4            + 367 * (mon - 2 - (mon - 14) / 12 * 12) / 12            - 3 * ((year + 4900L + (mon - 14) / 12) / 100) / 4            - 2440588;    ret = 24*ret + hour;     /* hours   */    ret = 60*ret + minute;   /* minutes */    ret = 60*ret + second;   /* seconds */    return ret;}static const char haystack[37]="janfebmaraprmayjunjulaugsepoctnovdec";// we follow the recommendation of rfc2822 to consider all// obsolete time zones not listed here equivalent to "-0000"static const struct {    const char *tzName;    int tzOffset;} known_zones[] = {    { "UT", 0 },    { "GMT", 0 },    { "EST", -300 },    { "EDT", -240 },    { "CST", -360 },    { "CDT", -300 },    { "MST", -420 },    { "MDT", -360 },    { "PST", -480 },    { "PDT", -420 },    { 0, 0 }};static inline bool isSpaceOrTab(char c){    return c == ' ' || c == '\t';}time_t KJS::KRFCDate_parseDate(const UString &_date){     // This parse a date in the form:     //     Wednesday, 09-Nov-99 23:12:40 GMT     // or     //     Sat, 01-Jan-2000 08:00:00 GMT     // or     //     Sat, 01 Jan 2000 08:00:00 GMT     // or     //     01 Jan 99 22:00 +0100    (exceptions in rfc822/rfc2822)     // ### non RFC format, added for Javascript:     //     [Wednesday] January 09 1999 23:12:40 GMT     //     // We ignore the weekday     //     int offset = 0;     char *newPosStr;     const char *dateString = _date.ascii();     int day = 0;     char monthStr[4];     int month = -1; // not set yet     int year = 0;     int hour = 0;     int minute = 0;     int second = 0;     errno = 0;     // Skip leading space     while (isSpaceOrTab(*dateString))     	dateString++;     const char *wordStart = dateString;     // Check contents of first words if not number     while(*dateString && !isdigit(*dateString))     {        if ( isSpaceOrTab(*dateString) && dateString - wordStart >= 3 )        {          monthStr[0] = tolower(*wordStart++);          monthStr[1] = tolower(*wordStart++);          monthStr[2] = tolower(*wordStart++);          monthStr[3] = '\0';          //fprintf(stderr,"KJS::parseDate found word starting with '%s'\n", monthStr);          const char *str = strstr(haystack, monthStr);          if (str) {            int position = str - haystack;            if (position % 3 == 0) {              month = position / 3; // Jan=00, Feb=01, Mar=02, ..            }          }          while (isSpaceOrTab(*dateString))             dateString++;          wordStart = dateString;        }        else           dateString++;     }     while (isSpaceOrTab(*dateString))     	dateString++;     if (!*dateString)     	return invalidDate;     // ' 09-Nov-99 23:12:40 GMT'     day = strtol(dateString, &newPosStr, 10);     if (errno)        return invalidDate;     dateString = newPosStr;     if ((day < 1) || (day > 31))     	return invalidDate;     if (!*dateString)     	return invalidDate;     if (*dateString == '-' || *dateString == ',')     	dateString++;     while (isSpaceOrTab(*dateString))     	dateString++;     if ( month == -1 ) // not found yet     {        for(int i=0; i < 3;i++)        {           if (!*dateString || (*dateString == '-') || isSpaceOrTab(*dateString))              return invalidDate;           monthStr[i] = tolower(*dateString++);        }        monthStr[3] = '\0';        newPosStr = (char*)strstr(haystack, monthStr);        if (!newPosStr || (newPosStr - haystack) % 3 != 0)           return invalidDate;        month = (newPosStr-haystack)/3; // Jan=00, Feb=01, Mar=02, ..        if ((month < 0) || (month > 11))           return invalidDate;        while (*dateString && *dateString != '-' && !isSpaceOrTab(*dateString))           dateString++;        if (!*dateString)           return invalidDate;        // '-99 23:12:40 GMT'        if (*dateString != '-' && !isSpaceOrTab(*dateString))           return invalidDate;        dateString++;     }     if ((month < 0) || (month > 11))     	return invalidDate;     // '99 23:12:40 GMT'     bool gotYear = true;     year = strtol(dateString, &newPosStr, 10);     if (errno)        return invalidDate;     dateString = newPosStr;     // Don't fail if the time is missing.     if (*dateString == ':' || (isSpaceOrTab(*dateString) && isdigit(dateString[1])))     {        if (*dateString == ':') {          hour = year;          gotYear = false;        } else {          // ' 23:12:40 GMT'          ++dateString;                  hour = strtol(dateString, &newPosStr, 10);          if (errno)            return invalidDate;          dateString = newPosStr;        }        if ((hour < 0) || (hour > 23))           return invalidDate;        if (!*dateString)           return invalidDate;        // ':12:40 GMT'        if (*dateString++ != ':')           return invalidDate;        minute = strtol(dateString, &newPosStr, 10);        if (errno)          return invalidDate;        dateString = newPosStr;        if ((minute < 0) || (minute > 59))           return invalidDate;        // seconds are optional in rfc822 + rfc2822        if (*dateString ==':') {           dateString++;           second = strtol(dateString, &newPosStr, 10);           if (errno)             return invalidDate;           dateString = newPosStr;           if ((second < 0) || (second > 59))              return invalidDate;        }     }          while (isSpaceOrTab(*dateString))        dateString++;     if (!gotYear) {        year = strtol(dateString, &newPosStr, 10);        if (errno)          return invalidDate;        while (isSpaceOrTab(*dateString))           dateString++;     }     // Y2K: Solve 2 digit years     if ((year >= 0) && (year < 50))         year += 2000;     if ((year >= 50) && (year < 100))         year += 1900;  // Y2K     if ((year < 1900) || (year > 2500))     	return invalidDate;     if (strncasecmp(dateString, "AM", 2) == 0) {        if (hour < 1 || hour > 12)            return invalidDate;        if (hour == 12)            hour = 0;        dateString += 2;        while (isSpaceOrTab(*dateString))           dateString++;     } else if (strncasecmp(dateString, "PM", 2) == 0) {        if (hour < 1 || hour > 12)            return invalidDate;        if (hour != 12)            hour += 12;        dateString += 2;        while (isSpaceOrTab(*dateString))           dateString++;     }     // don't fail if the time zone is missing, some     // broken mail-/news-clients omit the time zone     bool localTime;     if (*dateString == 0) {        // Other web browsers interpret missing time zone as "current time zone".        localTime = true;     } else {        localTime = false;        if (strncasecmp(dateString, "GMT", 3) == 0) {            dateString += 3;        }        if ((*dateString == '+') || (*dateString == '-')) {           offset = strtol(dateString, &newPosStr, 10);           if (errno || (offset < -9959) || (offset > 9959))              return invalidDate;           int sgn = (offset < 0)? -1:1;           offset = abs(offset);           offset = ((offset / 100)*60 + (offset % 100))*sgn;        } else {           for (int i=0; known_zones[i].tzName != 0; i++) {              if (0 == strncasecmp(dateString, known_zones[i].tzName, strlen(known_zones[i].tzName))) {                 offset = known_zones[i].tzOffset;                 break;              }           }        }     }     if (sizeof(time_t) == 4)     {         if ((time_t)-1 < 0)         {            if (year >= 2038)            {               year = 2038;               month = 0;               day = 1;               hour = 0;               minute = 0;               second = 0;            }         }         else         {            if (year >= 2115)            {               year = 2115;               month = 0;               day = 1;               hour = 0;               minute = 0;               second = 0;            }         }     }    time_t result;         if (localTime) {      struct tm tm;      tm.tm_year = year - 1900;      tm.tm_mon = month;      tm.tm_mday = day;      tm.tm_hour = hour;      tm.tm_min = minute;      tm.tm_sec = second;      tm.tm_isdst = -1;      result = mktime(&tm);    } else {     result = ymdhms_to_seconds(year, month+1, day, hour, minute, second);     // avoid negative time values     if ((offset > 0) && (offset > result))        offset = 0;     result -= offset*60;    }     return result;}Value KJS::timeClip(const Value &t){  /* TODO */  return t;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -