1

JavaScriptを使用して、5月の最後の月曜日を取得する最良の方法はどれですか? 月の最後の日を取得できることを知っており、希望する日までの日数の差を差し引きます。しかし、それを行うための短くてエレガントで効率的な方法はありますか?

ありがとう

4

5 に答える 5

1
function getLastMonday(month, year) {
  var d = new Date();
  if (year) { d.setFullYear(year); }
  d.setDate(1); // Roll to the first day of ...
  d.setMonth(month || d.getMonth() + 1); // ... the next month.
  do { // Roll the days backwards until Monday.
    d.setDate(d.getDate() - 1);
  } while (d.getDay() !== 1);
  return d;
}

getLastMonday();        // => Mon Mar 25 2013 12:44:39 GMT-0600 (MDT)
getLastMonday(5);       // => Mon May 27 2013 12:41:52 GMT-0600 (MDT)
getLastMonday(1, 2000); // => Mon Jan 31 2000 12:43:15 GMT-0700 (MST)
于 2013-03-19T18:43:27.583 に答える
0

私のソリューションを投稿します。最後の日が日曜日の場合、他のソリューションには問題があることがわかりました (最後の月曜日の日付として 32 が返されました - 2015 年 5 月 31 日日曜日を参照してください。

        function lastMondayOfMay(year, month) {
            var d = new Date(year, month, 0); //last day of desired month
            if (d.getDay() == 0) {
                //deals with sunday - subtracts 6 instead of adding 1
                return d.getDate() - 6;  
                } else {
                return d.getDate() - (d.getDay() - 1);
                }
            return d.getDate() - (d.getDay() - 1);//1 here represents monday
        }
于 2015-03-11T16:06:41.730 に答える
0

したがって、他の回答の問題は、私の質問が間違っていることです。私が最初に望んでいたのは、特定の日が 5 月 (または他の月) の最後の月曜日であるかどうかを確認することでした。5月の最後の月曜日を取得する方法ではありません。申し訳ありません。

私が信じている私自身の質問に対する最良の答えはこれです:

function lastMondayOfMay() {
    var d = new Date(2013, 5, 0); //last day of desired month
    return d.getDate() - (d.getDay() - 1);//1 here represents monday
}

他の月については、必要な月の最終日を指す日付を作成するだけです。

これに答えようとする皆さんの努力に感謝します。しかし、私の質問はまだ残っています: 特定の日付が月の最後の月曜日かどうかを知る最良の方法はどれですか? 私のソリューションを使用して日付を比較することは、私が現在行っていることです。それを行うより直接的な方法はありますか?

これで2番目の質問にも答えられると思います:

function isLastMonday(date) {//date format: 'DD/MM/YYYY'
    var d = new Date(date);
    return d.getDay() === 1 && (d.getDate() + 7) > 30; //1 here represents monday
}

isLastMonday('05/27/2013');//true
isLastMonday('05/26/2013');//false
isLastMonday('02/25/2013');//true
isLastMonday('03/24/2013');//false

私は実際にはもっと多くの日付でテストしていますが、問題ないようです。私のコードが失敗するシナリオを誰かが思いつくことができますか?

わかりました、この 3 番目の質問にもお答えします。これが起こる唯一の月は2月です。これは、テストに失敗するには、最後の月曜日が 24 日より前になる必要があるためです。私は 5 月のことしか心配していないので (メモリアル デーの休日を計算するために使用しています)、私の解決策で十分だと思います。

于 2013-03-19T18:56:44.527 に答える
-1

これよりも短くて効率的な方法は知りません (しかし、私は JavaScript の第一人者ではありません)。

var d = new Date( 2013, 5, 0 );
while( d.getDay() != 1 )
{
    d.setDate( d.getDate() - 1 ); 
}
console.log( d.toString() );

(この回答に部分的に触発され、コメントで sachleenが言及したこと)

しかし、それは基本的に、あなたの質問であなたがすでに提案したものです。

于 2013-03-19T18:32:38.940 に答える