From 3e0fd9d7d2b645f7a396dfe1a4d3334a8e438e16 Mon Sep 17 00:00:00 2001 From: Iskren Chernev Date: Tue, 4 Feb 2014 01:01:12 -0800 Subject: [PATCH] Add weeksInYear and isoWeeksInYear This implements #1289. I think the week and iso week stuff should go in a separate calendar at some point. --- moment.js | 13 +++++ test/moment/weeks_in_year.js | 96 ++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 test/moment/weeks_in_year.js diff --git a/moment.js b/moment.js index 5c3a39da5..ed88f4668 100644 --- a/moment.js +++ b/moment.js @@ -561,6 +561,10 @@ return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); } + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } + function daysInYear(year) { return isLeapYear(year) ? 366 : 365; } @@ -2127,6 +2131,15 @@ return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); }, + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, + + weeksInYear : function () { + var weekInfo = this._lang._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, + get : function (units) { units = normalizeUnits(units); return this[units](); diff --git a/test/moment/weeks_in_year.js b/test/moment/weeks_in_year.js new file mode 100644 index 000000000..226154006 --- /dev/null +++ b/test/moment/weeks_in_year.js @@ -0,0 +1,96 @@ +var moment = require("../../moment"); + +exports.weeks_in_year = { + "isoWeeksInYear": function (test) { + test.equal(moment([2004]).isoWeeksInYear(), 53, "2004 has 53 iso weeks"); + test.equal(moment([2005]).isoWeeksInYear(), 52, "2005 has 53 iso weeks"); + test.equal(moment([2006]).isoWeeksInYear(), 52, "2006 has 53 iso weeks"); + test.equal(moment([2007]).isoWeeksInYear(), 52, "2007 has 52 iso weeks"); + test.equal(moment([2008]).isoWeeksInYear(), 52, "2008 has 53 iso weeks"); + test.equal(moment([2009]).isoWeeksInYear(), 53, "2009 has 53 iso weeks"); + test.equal(moment([2010]).isoWeeksInYear(), 52, "2010 has 52 iso weeks"); + test.equal(moment([2011]).isoWeeksInYear(), 52, "2011 has 52 iso weeks"); + test.equal(moment([2012]).isoWeeksInYear(), 52, "2012 has 52 iso weeks"); + test.equal(moment([2013]).isoWeeksInYear(), 52, "2013 has 52 iso weeks"); + test.equal(moment([2014]).isoWeeksInYear(), 52, "2014 has 52 iso weeks"); + test.equal(moment([2015]).isoWeeksInYear(), 53, "2015 has 53 iso weeks"); + + test.done(); + }, + + "weeksInYear doy/dow = 1/4": function (test) { + moment.lang('1/4', {week: {dow: 1, doy: 4}}); + + test.equal(moment([2004]).weeksInYear(), 53, "2004 has 53 weeks"); + test.equal(moment([2005]).weeksInYear(), 52, "2005 has 53 weeks"); + test.equal(moment([2006]).weeksInYear(), 52, "2006 has 53 weeks"); + test.equal(moment([2007]).weeksInYear(), 52, "2007 has 52 weeks"); + test.equal(moment([2008]).weeksInYear(), 52, "2008 has 53 weeks"); + test.equal(moment([2009]).weeksInYear(), 53, "2009 has 53 weeks"); + test.equal(moment([2010]).weeksInYear(), 52, "2010 has 52 weeks"); + test.equal(moment([2011]).weeksInYear(), 52, "2011 has 52 weeks"); + test.equal(moment([2012]).weeksInYear(), 52, "2012 has 52 weeks"); + test.equal(moment([2013]).weeksInYear(), 52, "2013 has 52 weeks"); + test.equal(moment([2014]).weeksInYear(), 52, "2014 has 52 weeks"); + test.equal(moment([2015]).weeksInYear(), 53, "2015 has 53 weeks"); + + test.done(); + }, + + "weeksInYear doy/dow = 6/12": function (test) { + moment.lang('6/12', {week: {dow: 6, doy: 12}}); + + test.equal(moment([2004]).weeksInYear(), 53, "2004 has 53 weeks"); + test.equal(moment([2005]).weeksInYear(), 52, "2005 has 53 weeks"); + test.equal(moment([2006]).weeksInYear(), 52, "2006 has 53 weeks"); + test.equal(moment([2007]).weeksInYear(), 52, "2007 has 52 weeks"); + test.equal(moment([2008]).weeksInYear(), 52, "2008 has 53 weeks"); + test.equal(moment([2009]).weeksInYear(), 52, "2009 has 53 weeks"); + test.equal(moment([2010]).weeksInYear(), 53, "2010 has 52 weeks"); + test.equal(moment([2011]).weeksInYear(), 52, "2011 has 52 weeks"); + test.equal(moment([2012]).weeksInYear(), 52, "2012 has 52 weeks"); + test.equal(moment([2013]).weeksInYear(), 52, "2013 has 52 weeks"); + test.equal(moment([2014]).weeksInYear(), 52, "2014 has 52 weeks"); + test.equal(moment([2015]).weeksInYear(), 52, "2015 has 53 weeks"); + + test.done(); + }, + + "weeksInYear doy/dow = 1/7": function (test) { + moment.lang('1/7', {week: {dow: 1, doy: 7}}); + + test.equal(moment([2004]).weeksInYear(), 52, "2004 has 53 weeks"); + test.equal(moment([2005]).weeksInYear(), 52, "2005 has 53 weeks"); + test.equal(moment([2006]).weeksInYear(), 53, "2006 has 53 weeks"); + test.equal(moment([2007]).weeksInYear(), 52, "2007 has 52 weeks"); + test.equal(moment([2008]).weeksInYear(), 52, "2008 has 53 weeks"); + test.equal(moment([2009]).weeksInYear(), 52, "2009 has 53 weeks"); + test.equal(moment([2010]).weeksInYear(), 52, "2010 has 52 weeks"); + test.equal(moment([2011]).weeksInYear(), 52, "2011 has 52 weeks"); + test.equal(moment([2012]).weeksInYear(), 53, "2012 has 52 weeks"); + test.equal(moment([2013]).weeksInYear(), 52, "2013 has 52 weeks"); + test.equal(moment([2014]).weeksInYear(), 52, "2014 has 52 weeks"); + test.equal(moment([2015]).weeksInYear(), 52, "2015 has 53 weeks"); + + test.done(); + }, + + "weeksInYear doy/dow = 0/6": function (test) { + moment.lang('0/6', {week: {dow: 0, doy: 6}}); + + test.equal(moment([2004]).weeksInYear(), 52, "2004 has 53 weeks"); + test.equal(moment([2005]).weeksInYear(), 53, "2005 has 53 weeks"); + test.equal(moment([2006]).weeksInYear(), 52, "2006 has 53 weeks"); + test.equal(moment([2007]).weeksInYear(), 52, "2007 has 52 weeks"); + test.equal(moment([2008]).weeksInYear(), 52, "2008 has 53 weeks"); + test.equal(moment([2009]).weeksInYear(), 52, "2009 has 53 weeks"); + test.equal(moment([2010]).weeksInYear(), 52, "2010 has 52 weeks"); + test.equal(moment([2011]).weeksInYear(), 53, "2011 has 52 weeks"); + test.equal(moment([2012]).weeksInYear(), 52, "2012 has 52 weeks"); + test.equal(moment([2013]).weeksInYear(), 52, "2013 has 52 weeks"); + test.equal(moment([2014]).weeksInYear(), 52, "2014 has 52 weeks"); + test.equal(moment([2015]).weeksInYear(), 52, "2015 has 53 weeks"); + + test.done(); + } +}; -- 2.47.2