moment.js thinks that 2013-12-31 is week 1, not week 53

It is because the week from the 30th december 2013 is considered to be the 1st week of 2014 as you may see on this page epoch converter

And according to momentjs documentation:

The week with January 1st in it is the first week of the year.


This is expected behavior. According to the ISO 8601 standard, 2013 is not a year with 53 weeks.

The long years, with 53 weeks in them, can be described by any of the following equivalent definitions:

  • any year starting on Thursday (dominical letter D or DC) and any leap year starting on Wednesday (ED)
  • any year ending on Thursday (D, ED) and any leap year ending on Friday (DC)
  • years in which 1 January and 31 December (in common years) or either (in leap years) are Thursdays

(source)

2013 started and ended on a Tuesday so therefore it is not a "long year" and 2013-12-31 is considered part of the first week of 2014.

If you want that week to be the 53rd, you'll have to write custom code for it as the ISO standard won't agree with you!


I had a problem at my work where we used .format('YYYY WW') for some comparison logic.

That doesn't really make sense, as you should probably use .format('gggg WW') in such cases.

moment('2013-12-31').format('YYYY w'); // Returns 2013 1
moment('2013-12-31').format('gggg w'); // Returns 2014 1

https://momentjs.com/docs/#/displaying/format/