From: Tim Wood Date: Tue, 10 Apr 2012 16:36:13 +0000 (-0700) Subject: Speed improvement tests X-Git-Tag: 1.6.0~1^2~11^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf27afe3fe8d860deb3b3cc0b17c4eeb0cecdc8e;p=thirdparty%2Fmoment.git Speed improvement tests --- diff --git a/moment.js b/moment.js index deef7e79b..69fa28157 100644 --- a/moment.js +++ b/moment.js @@ -293,113 +293,110 @@ } } - // date from string and format string - function makeDateFromStringAndFormat(string, format) { - var inArray = [0, 0, 1, 0, 0, 0, 0], - timezoneHours = 0, - timezoneMinutes = 0, - isUsingUTC = false, - formatParts = format.match(tokenCharacters), - i, - isPm, - formatA; - - // function to convert string input to date - function addTime(format, _input) { - var a, input = _input[0]; - //console.log('addTime', format, input); - switch (format) { - // MONTH - case 'M' : // fall through to MM - case 'MM' : - inArray[1] = ~~input - 1; - break; - case 'MMM' : // fall through to MMMM - case 'MMMM' : - for (a = 0; a < 12; a++) { - if (moment.monthsParse[a].test(input)) { - inArray[1] = a; - break; - } - } - break; - // DAY OF MONTH - case 'D' : // fall through to DDDD - case 'DD' : // fall through to DDDD - case 'DDD' : // fall through to DDDD - case 'DDDD' : - inArray[2] = ~~input; - break; - // YEAR - case 'YY' : - input = ~~input; - inArray[0] = input + (input > 70 ? 1900 : 2000); - break; - case 'YYYY' : - inArray[0] = ~~Math.abs(input); - break; - // AM / PM - case 'a' : // fall through to A - case 'A' : - isPm = (input.toLowerCase() === 'pm'); - break; - // 24 HOUR - case 'H' : // fall through to hh - case 'HH' : // fall through to hh - case 'h' : // fall through to hh - case 'hh' : - inArray[3] = ~~input; - break; - // MINUTE - case 'm' : // fall through to mm - case 'mm' : - inArray[4] = ~~input; - break; - // SECOND - case 's' : // fall through to ss - case 'ss' : - inArray[5] = ~~input; - break; - // TIMEZONE - case 'Z' : // fall through to ZZ - case 'ZZ' : - isUsingUTC = true; - a = (input || '').match(timezoneParseRegex); - if (a && a[1]) { - timezoneHours = ~~a[1]; - } - if (a && a[2]) { - timezoneMinutes = ~~a[2]; - } - // reverse offsets - if (a && a[0] === '+') { - timezoneHours = -timezoneHours; - timezoneMinutes = -timezoneMinutes; + // function to convert string input to date + function addTimeToArrayFromToken(token, input, datePartArray, config) { + var a; + //console.log('addTime', format, input); + switch (token) { + // MONTH + case 'M' : // fall through to MM + case 'MM' : + datePartArray[1] = ~~input - 1; + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + for (a = 0; a < 12; a++) { + if (moment.monthsParse[a].test(input)) { + datePartArray[1] = a; + break; } - break; } + break; + // DAY OF MONTH + case 'D' : // fall through to DDDD + case 'DD' : // fall through to DDDD + case 'DDD' : // fall through to DDDD + case 'DDDD' : + datePartArray[2] = ~~input; + break; + // YEAR + case 'YY' : + input = ~~input; + datePartArray[0] = input + (input > 70 ? 1900 : 2000); + break; + case 'YYYY' : + datePartArray[0] = ~~Math.abs(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config.isPm = (input.toLowerCase() === 'pm'); + break; + // 24 HOUR + case 'H' : // fall through to hh + case 'HH' : // fall through to hh + case 'h' : // fall through to hh + case 'hh' : + datePartArray[3] = ~~input; + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[4] = ~~input; + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[5] = ~~input; + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config.isUTC = true; + a = (input + '').match(timezoneParseRegex); + if (a && a[1]) { + config.tzh = ~~a[1]; + } + if (a && a[2]) { + config.tzm = ~~a[2]; + } + // reverse offsets + if (a && a[0] === '+') { + config.tzh = -config.tzh; + config.tzm = -config.tzm; + } + break; } + } - for (i = 0; i < formatParts.length; i++) { - formatA = getParseRegexForToken(formatParts[i]).exec(string) || [0]; - string = string.replace(getParseRegexForToken(formatParts[i]), ''); - addTime(formatParts[i], formatA); - //console.log('string = ' + string); - //addTime(formatParts[i], inputParts[i]); + // date from string and format string + function makeDateFromStringAndFormat(string, format) { + var datePartArray = [0, 0, 1, 0, 0, 0, 0], + config = { + tzh : 0, // timezone hour offset + tzm : 0 // timezone minute offset + }, + tokens = format.match(tokenCharacters), + i, parsedInput; + + for (i = 0; i < tokens.length; i++) { + parsedInput = (getParseRegexForToken(tokens[i]).exec(string) || [0])[0]; + string = string.replace(getParseRegexForToken(tokens[i]), ''); + addTimeToArrayFromToken(tokens[i], parsedInput, datePartArray, config); } // handle am pm - if (isPm && inArray[3] < 12) { - inArray[3] += 12; + if (config.isPm && datePartArray[3] < 12) { + datePartArray[3] += 12; } // if is 12 am, change hours to 0 - if (isPm === false && inArray[3] === 12) { - inArray[3] = 0; + if (config.isPm === false && datePartArray[3] === 12) { + datePartArray[3] = 0; } // handle timezone - inArray[3] += timezoneHours; - inArray[4] += timezoneMinutes; + datePartArray[3] += config.tzh; + datePartArray[4] += config.tzm; // return - return isUsingUTC ? new Date(Date.UTC.apply({}, inArray)) : dateFromArray(inArray); + return config.isUTC ? new Date(Date.UTC.apply({}, datePartArray)) : dateFromArray(datePartArray); } // compare two arrays, return the number of differences