We're using this implementation of calculating ISO 8601 week numbers in Javascript. This has worked great for us in North America, but we recently starting hearing bug reports from our users in Australia that we're showing the wrong week number. Sure enough changing our timezone to AEST
starting getting us the wrong week numbers. Here's the output:
AEST Output
var date = new Date();
date; // -> Fri May 12 2017 04:43:15 GMT+1000 (AEST)
var target = new Date(date.valueOf());
target; // -> Fri May 12 2017 04:05:13 GMT+1000 (AEST)
target.setDate(target.getDate() - ((date.getDay() + 6) % 7) + 3);
target; // -> Thu May 11 2017 04:05:13 GMT+1000 (AEST)
var thisThursday = target.valueOf();
thisThursday; // -> 1494439513182
target.setMonth(0, 1);
target; // -> Sun Jan 01 2017 04:05:13 GMT+1100 (AEDT)
if (target.getDay() !== 4) {
target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
}
target; // -> Thu Jan 05 2017 04:05:13 GMT+1100 (AEDT)
var weekNumber = 1 + Math.ceil((thisThursday - target) / 604800000);
weekNumber; // -> 20 [Should be 19]
PDT Output
var date = new Date();
date; // -> Thu May 11 2017 11:56:36 GMT-0700 (PDT)
var target = new Date(date.valueOf());
target; // -> Thu May 11 2017 11:56:36 GMT-0700 (PDT)
target.setDate(target.getDate() - ((date.getDay() + 6) % 7) + 3);
target; // -> Thu May 11 2017 11:56:36 GMT-0700 (PDT)
var thisThursday = target.valueOf();
thisThursday; // -> 1494528996804
target.setMonth(0, 1);
target; // -> Sun Jan 01 2017 11:56:36 GMT-0800 (PST)
if (target.getDay() !== 4) {
target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
}
target; // -> Thu Jan 05 2017 11:56:36 GMT-0800 (PST)
var weekNumber = 1 + Math.ceil((thisThursday - target) / 604800000);
weekNumber; // -> 19 [Correct!]
This is pretty bizarre for us and would love some help figuring out what could be going wrong with the different timezones.