From 70bbe592a12185b7df13f2a23848293a6f13ff25 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 20 Sep 2026 19:25:18 +0000 Subject: [PATCH] Return 1-indexed week numbers so January is never week 0 Math.floor(days / 7) yields 0 for dates in the first partial week (for example 3 January 2017). Adding 1 keeps Sunday-start numbering and matches this package's simple 1-based API. Fixes #3 Co-authored-by: David --- .verb.md | 5 +++++ README.md | 5 +++++ index.js | 2 +- test.js | 35 ++++++++++++++++++++++++++++++++--- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/.verb.md b/.verb.md index 4c846f3..3bb8b01 100644 --- a/.verb.md +++ b/.verb.md @@ -5,4 +5,9 @@ var week = require('week'); week(); //=> '50' (December) + +week(new Date(2017, 0, 3)); +//=> '1' ``` + +Week numbers are **1-indexed**. Week 1 is the week that contains January 1, and weeks start on Sunday. This is a simple helper (similar to 1-based `M`/`MM` month numbers), not ISO 8601 week numbering. diff --git a/README.md b/README.md index fb76011..a80220d 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,13 @@ var week = require('week'); week(); //=> '50' (December) + +week(new Date(2017, 0, 3)); +//=> '1' ``` +Week numbers are **1-indexed**. Week 1 is the week that contains January 1, and weeks start on Sunday. This is a simple helper (similar to 1-based `M`/`MM` month numbers), not ISO 8601 week numbering. + ## About ### Related projects diff --git a/index.js b/index.js index ed8c298..3f232ab 100644 --- a/index.js +++ b/index.js @@ -12,5 +12,5 @@ module.exports = function week(date) { var first = new Date(date.getFullYear(), 0, 1); var diff = ((date - first) / 86400000); var days = (diff + first.getDay()); - return Math.floor(days / 7).toString(); + return (Math.floor(days / 7) + 1).toString(); }; diff --git a/test.js b/test.js index f3b3754..a6ea125 100644 --- a/test.js +++ b/test.js @@ -7,11 +7,40 @@ require('mocha'); var assert = require('assert'); -var moment = require('moment'); var week = require('./'); describe('week()', function () { - it('should return an object with the number and name of the current week', function () { - assert.equal(week(), moment(new Date()).format('WW')); + it('should return the current week as a 1-indexed numeric string', function () { + var current = week(); + assert.equal(typeof current, 'string'); + assert.ok(/^[1-9]\d*$/.test(current), 'expected a 1-indexed week string, got ' + current); + var n = +current; + assert.ok(n >= 1 && n <= 53); + }); + + it('should not return week 0 for 3 January 2017 (#3)', function () { + // Reporter: week() emitted "0" on 3 January 2017 (Tue; Jan 1 was Sunday). + assert.equal(week(new Date(2017, 0, 3)), '1'); + }); + + it('should treat January 1 through the first Saturday as week 1', function () { + assert.equal(week(new Date(2017, 0, 1)), '1'); + assert.equal(week(new Date(2017, 0, 2)), '1'); + assert.equal(week(new Date(2017, 0, 7)), '1'); + assert.equal(week(new Date(2017, 0, 8)), '2'); + }); + + it('should stay 1-indexed when January 1 is not Sunday', function () { + // 1 January 2016 was a Friday — previously emitted "0". + assert.equal(week(new Date(2016, 0, 1)), '1'); + assert.equal(week(new Date(2016, 0, 2)), '1'); + // First Sunday of 2016 starts week 2. + assert.equal(week(new Date(2016, 0, 3)), '2'); + }); + + it('should preserve Sunday-start numbering later in the year', function () { + // 13 March 2017 was reported as week 10 (off-by-one); week 1 started Jan 1. + assert.equal(week(new Date(2017, 2, 13)), '11'); + assert.equal(week(new Date(2017, 11, 31)), '53'); }); });