📄 date_object.cpp
字号:
#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 + -