From: Iskren Chernev Date: Sat, 3 May 2014 08:03:10 +0000 (-0700) Subject: Refactor week initialization X-Git-Tag: 2.7.0~23^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c49c9607bb328c17bca0fd95260533fd3d005ccd;p=thirdparty%2Fmoment.git Refactor week initialization --- diff --git a/moment.js b/moment.js index c5ca0bd49..c0070c93f 100644 --- a/moment.js +++ b/moment.js @@ -283,6 +283,16 @@ lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; + function dfl() { + var i; + for (i = 0; i < arguments.length; ++i) { + if (arguments[i] != null) { + return arguments[i]; + } + } + return null; + } + function defaultParsingFlags() { // We need to deep clone this object, and es5 standard is not very // helpful. @@ -1151,30 +1161,82 @@ config._useUTC = true; config._tzm = timezoneMinutesFromString(input); break; + case 'dd': + case 'ddd': + case 'dddd': + a = getLangDefinition(config._l).weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } + break; case 'w': case 'ww': case 'W': case 'WW': case 'd': - case 'dd': - case 'ddd': - case 'dddd': case 'e': case 'E': token = token.substr(0, 1); /* falls through */ - case 'gg': case 'gggg': - case 'GG': case 'GGGG': case 'GGGGG': token = token.substr(0, 2); if (input) { config._w = config._w || {}; - config._w[token] = input; + config._w[token] = toInt(input); } break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, lang; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + lang = getLangDefinition(config._l); + dow = lang._week.dow; + doy = lang._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; } // convert an array to a date. @@ -1182,8 +1244,7 @@ // note: all values past the year are optional and will default to the lowest possible value. // [year, month, day , hour, minute, second, millisecond] function dateFromConfig(config) { - var i, date, input = [], currentDate, - yearToUse, fixYear, w, temp, lang, weekday, week; + var i, date, input = [], currentDate, yearToUse; if (config._d) { return; @@ -1193,39 +1254,12 @@ //compute day of the year from weeks and weekdays if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - fixYear = function (val) { - var intVal = parseInt(val, 10); - return val ? - (val.length < 3 ? (intVal > 68 ? 1900 + intVal : 2000 + intVal) : intVal) : - (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]); - }; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1); - } - else { - lang = getLangDefinition(config._l); - weekday = w.d != null ? parseWeekday(w.d, lang) : - ((w.e != null ? parseInt(w.e, 10) : 0) + lang._week.dow); - - week = parseInt(w.w, 10) || 1; - - //if we're parsing 'd', then the low day numbers may be next week - if (w.d != null && weekday < lang._week.dow) { - week++; - } - - temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow); - } - - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; + dayOfYearFromWeekInfo(config); } //if the day of the year is set, figure out what it is if (config._dayOfYear) { - yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR]; + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); if (config._dayOfYear > daysInYear(yearToUse)) { config._pf._overflowDayOfYear = true; diff --git a/test/moment/create.js b/test/moment/create.js index 9c5cc8494..a96f016e9 100644 --- a/test/moment/create.js +++ b/test/moment/create.js @@ -803,7 +803,7 @@ exports.create = { "parsing week and weekday information" : function (test) { var ver = getVerifier(test); - //year + // year ver('12', 'gg', "2012 01 01", 'week-year two digits'); ver('2012', 'gggg', "2012 01 01", 'week-year four digits'); @@ -816,7 +816,7 @@ exports.create = { ver('13', 'GG', "2012 12 31", 'iso week-year two digits previous year'); ver('2013', 'GGGG', "2012 12 31", 'iso week-year four digits previous year'); - //yer + week + // year + week ver('1999 37', 'gggg w', "1999 09 05", 'week'); ver('1999 37', 'gggg ww', "1999 09 05", 'week double'); ver('1999 37', 'GGGG W', "1999 09 13", 'iso week'); @@ -828,13 +828,13 @@ exports.create = { ver('1999 37 4', 'gggg ww e', "1999 09 09", 'day'); ver('1999 37 04', 'gggg ww e', "1999 09 09", 'day wide', true); - //yer + week + day + // year + week + day ver('1999 37 4', 'gggg ww d', "1999 09 09", 'd'); ver('1999 37 Th', 'gggg ww dd', "1999 09 09", 'dd'); ver('1999 37 Thu', 'gggg ww ddd', "1999 09 09", 'ddd'); ver('1999 37 Thursday', 'gggg ww dddd', "1999 09 09", 'dddd'); - //lower-order only + // lower-order only test.equal(moment('22', 'ww').week(), 22, "week sets the week by itself"); test.equal(moment('22', 'ww').weekYear(), moment().weekYear(), "week keeps this year"); test.equal(moment('2012 22', 'YYYY ww').weekYear(), 2012, "week keeps parsed year"); @@ -843,7 +843,7 @@ exports.create = { test.equal(moment('2012 22', 'YYYY WW').weekYear(), 2012, "iso week keeps parsed year"); test.equal(moment('22', 'WW').weekYear(), moment().weekYear(), "iso week keeps this year"); - //order + // order ver('6 2013 2', 'e gggg w', "2013 01 12", "order doesn't matter"); ver('6 2013 2', 'E GGGG W', "2013 01 12", "iso order doesn't matter");