你的第一個問題是在正確的時間獲取日期對象。世界上至少有3個不同時區使用「EST」時區,但我假設您需要UTC-05:00的美國EST。
Javascript日期對象的心臟有UTC時間值,因此您可以獲取本地日期對象,減去5小時,然後使用UTC方法獲取等效美國EST時區的值。一旦你有了這個日期對象,你只需要得到每個答案here的星期編號,除了你應該使用UTC方法而不是普通的日期方法(例如getUTCFullYear而不是getFullYear)。
請注意,這將忽略客戶端位置的夏令時,並且EST未指示夏令時是否生效。通常會給出不同的時區指示符(例如,使用美國的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
在一個側面說明,一定要驗證表單服務器端以及!客戶端JavaScript可以禁用用戶繞過檢查。 – thgaskell 2013-03-08 00:49:31