最初の問題は、正しい時間で日付オブジェクトを取得することです。タイムゾーン「EST」は、世界の少なくとも 3 つの異なる地域で異なるタイムゾーンとして使用されていますが、UTC-05:00 の US EST が必要であると仮定します。
Javascript の日付オブジェクトの中心には UTC 時間値があるため、ローカル日付オブジェクトを取得し、5 時間を減算してから、UTC メソッドを使用して同等の米国 EST タイムゾーンの値を取得できます。その日付オブジェクトを取得したら、ここで回答ごとに週番号を取得する必要があり ますが、単純な日付メソッドの代わりに UTC メソッドを使用する必要があります (たとえば、getFullYear ではなく getUTCFullYear)。
これはクライアントの場所で夏時間を無視し、EST は夏時間が有効かどうかを示さないことに注意してください。通常、別のタイムゾーン指定子が与えられます (たとえば、US 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