0

私はIEのWebフォームに取り組んでいます。

フォームを完成させましたが、ユーザーが日曜日の午後 6 時から月曜日 (翌日) の午後 3 時まで偶数週間だけフォームを使用できるようにする必要があります。これは、ユーザーがどこにいても EST にある必要があります。

私はJavascriptをあまり使ったことがなく、これを行う方法について完全に途方に暮れています。私が最も苦労しているのは、今日が今年の偶数週であると判断することです。(偶数週は有給週であり、これはフォームを使用する必要がある場合のみです。)

今日の日付が偶数週の基準にあることを最初のフィルターにしたいと思います。今日の日付と時間が私の基準の要求.getUTCDay()を満たすかどうかを判断する if, if else ステートメントを書きまし.getUTCHours()た。

修飾された日曜日と月曜日の日付の配列を使用することを考えていましたが、今日の日付が配列に含まれているかどうかを確認するための if ステートメントの書き方がわかりませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

0

最初の問題は、正しい時間で日付オブジェクトを取得することです。タイムゾーン「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
于 2013-03-08T00:48:13.840 に答える