您的第一个问题是在正确的时间获取日期对象。时区“EST”用于世界上至少 3 个不同时区的不同时区,但我假设您想要 UTC-05:00 的美国东部标准时间。
Javascript 日期对象的核心是 UTC 时间值,因此您可以获取本地日期对象,减去 5 小时,然后使用 UTC 方法获取等效的美国东部时间时区的值。一旦你有了那个日期对象,你只需要在这里得到每个答案的周数, 除了你应该使用UTC方法而不是普通的日期方法(例如getUTCFullYear而不是getFullYear)。
请注意,这将忽略客户端位置的夏令时,并且 EST 不指示夏令时是否有效。它通常被赋予不同的时区指示符(例如,使用美国东部标准时间和夏令时的地方调用他们的时区 EDT,这将是 UTC-04:00)。
这是一些应该完成这项工作的代码,请注意它只是经过轻微测试。我决定包含本地时区偏移量,以使其保持一致并且可能更容易理解。
// Returns true or false if current date is
// an even week of the year in timezone UTC-5:00
// Adjust local date object to be UTC-5:00 object
// Provide a date object to test, or undefined for
// current date
function isPayWeek(d) {
d = d? new Date(d) : new Date();
// Adjust for local timezone and US EST in minutes
d.setMinutes(d.getMinutes() + d.getTimezoneOffset() - 300);
// return true if week number is even (note: zero is even)
return !(getWeekNumber(d)[1] % 2)
}
function getWeekNumber(d) {
d = new Date(d);
d.setHours(0,0,0);
d.setDate(d.getDate() + 4 - (d.getDay()||7));
var yearStart = new Date(d.getFullYear(),0,1);
var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7)
// Return array of year and week number
return [d.getFullYear(), weekNo];
}
var d = new Date(2013,0,20,20,0,0); // 2013-01-20T10:00:00Z
var w = getWeekNumber(d); // week 3, 2013
alert(d + '\n' + 'week: ' + w + '\n' + isPayWeek(d)); // false
var d = new Date(2012,11,31,20,0,0); // 2012-12-31T10:00:00Z
var w = getWeekNumber(d); // week 1, 2013
alert(d + '\n' + 'week: ' + w + '\n' + isPayWeek(d)); // false
var d = new Date(2013,0,7,20,0,0); // 2013-01-07T10:00:00Z
var w = getWeekNumber(d); // week 2, 2013
alert(d + '\n' + 'week: ' + w + '\n' + isPayWeek(d)); // true