web-dev-qa-db-ja.com

JavaScript-現在の日付から週の最初の日を取得する

週の最初の日を取得する最速の方法が必要です。たとえば、今日は11月11日、木曜日です。今週の最初の日、11月8日と月曜日が欲しいです。 MongoDBマップ機能の最速の方法が必要ですか?

130
INs

DateオブジェクトのgetDayメソッドを使用すると、曜日(0 =日曜日、1 =月曜日など)を知ることができます。

次に、その日数に1を足したものを引きます。たとえば、次のようになります。

function getMonday(d) {
  d = new Date(d);
  var day = d.getDay(),
      diff = d.getDate() - day + (day == 0 ? -6:1); // adjust when day is sunday
  return new Date(d.setDate(diff));
}

getMonday(new Date()); // Mon Nov 08 2010
269
CMS

パフォーマンスを比較する方法はわかりませんが、これは機能します。

var today = new Date();
var day = today.getDay() || 7; // Get current day number, converting Sun. to 7
if( day !== 1 )                // Only manipulate the date if it isn't Mon.
    today.setHours(-24 * (day - 1));   // Set the hours to day number minus 1
                                         //   multiplied by negative 24
alert(today); // will be Monday

または関数として:

function getMonday( date ) {
    var day = date.getDay() || 7;  
    if( day !== 1 ) 
        date.setHours(-24 * (day - 1)); 
    return date;
}

getMonday(new Date());
46
user113716

チェックアウト Date.js

Date.today().previous().monday()
13
Matt
var dt = new Date(); // current date of week
var currentWeekDay = dt.getDay();
var lessDays = currentWeekDay == 0 ? 6 : currentWeekDay - 1;
var wkStart = new Date(new Date(dt).setDate(dt.getDate() - lessDays));
var wkEnd = new Date(new Date(wkStart).setDate(wkStart.getDate() + 6));

これはうまく機能します。

5
Parth Shah

CMSの答えは正しいですが、月曜日が週の最初の日であると想定しています。

時間/分/秒/ミリ秒で遊ぶ他の答えは間違っています。

以下の関数は正しく、日付を最初のパラメーターとして使用し、目的の週の最初の日を2番目のパラメーターとして使用します(日曜日の場合は0、月曜日の場合は1など)。注:時間、分、秒は0に設定されており、1日の始まりになっています。

function firstDayOfWeek(dateObject, firstDayOfWeekIndex) {

    const dayOfWeek = dateObject.getDay(),
        firstDayOfWeek = new Date(dateObject),
        diff = dayOfWeek >= firstDayOfWeekIndex ?
            dayOfWeek - firstDayOfWeekIndex :
            6 - dayOfWeek

    firstDayOfWeek.setDate(dateObject.getDate() - diff)
    firstDayOfWeek.setHours(0,0,0,0)

    return firstDayOfWeek
}

// August 18th was a Saturday
let lastMonday = firstDayOfWeek(new Date('August 18, 2018 03:24:00'), 1)

// outputs something like "Mon Aug 13 2018 00:00:00 GMT+0200"
// (may vary according to your time zone)
document.write(lastMonday)
4
Louis Ameline

私はこれを使用しています

function get_next_week_start() {
   var now = new Date();
   var next_week_start = new Date(now.getFullYear(), now.getMonth(), now.getDate()+(8 - now.getDay()));
   return next_week_start;
}
4
1nstinct

この関数は、現在のミリ秒時間を使用して現在の週を減算し、現在の日付が月曜日(javascriptは日曜日からカウント)である場合、さらに1週間を減算します。

function getMonday(fromDate) {
    // length of one day i milliseconds
  var dayLength = 24 * 60 * 60 * 1000;

  // Get the current date (without time)
    var currentDate = new Date(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate());

  // Get the current date's millisecond for this week
  var currentWeekDayMillisecond = ((currentDate.getDay()) * dayLength);

  // subtract the current date with the current date's millisecond for this week
  var monday = new Date(currentDate.getTime() - currentWeekDayMillisecond + dayLength);

  if (monday > currentDate) {
    // It is sunday, so we need to go back further
    monday = new Date(monday.getTime() - (dayLength * 7));
  }

  return monday;
}

週が1か月から別の月(そして何年も)に及ぶときにテストしましたが、正常に機能しているようです。

3
einord

こんばんは、

私は単純な拡張メソッドを持つことを好みます:

Date.prototype.startOfWeek = function (pStartOfWeek) {
    var mDifference = this.getDay() - pStartOfWeek;

    if (mDifference < 0) {
        mDifference += 7;
    }

    return new Date(this.addDays(mDifference * -1));
}

これは、私が使用する別の拡張メソッドを実際に利用していることに気付くでしょう。

Date.prototype.addDays = function (pDays) {
    var mDate = new Date(this.valueOf());
    mDate.setDate(mDate.getDate() + pDays);
    return mDate;
};

さて、週が日曜日に始まる場合、pStartOfWeekパラメーターに次のように「0」を渡します。

var mThisSunday = new Date().startOfWeek(0);

同様に、週が月曜日に始まる場合、pStartOfWeekパラメーターに「1」を渡します。

var mThisMonday = new Date().startOfWeek(1);

よろしく、

2
Chandler Zwolle

私の解決策は次のとおりです。

function getWeekDates(){
    var day_milliseconds = 24*60*60*1000;
    var dates = [];
    var current_date = new Date();
    var monday = new Date(current_date.getTime()-(current_date.getDay()-1)*day_milliseconds);
    var sunday = new Date(monday.getTime()+6*day_milliseconds);
    dates.Push(monday);
    for(var i = 1; i < 6; i++){
        dates.Push(new Date(monday.getTime()+i*day_milliseconds));
    }
    dates.Push(sunday);
    return dates;
}

返された配列インデックスから日付を選択できるようになりました。

1

setDate()には、上記のコメントに記載されている月の境界に関する問題があります。明確な回避策は、Dateオブジェクトの(驚くほど直感に反する)メソッドではなく、Epochタイムスタンプを使用して日付の違いを見つけることです。つまり.

function getPreviousMonday(fromDate) {
    var dayMillisecs = 24 * 60 * 60 * 1000;

    // Get Date object truncated to date.
    var d = new Date(new Date(fromDate || Date()).toISOString().slice(0, 10));

    // If today is Sunday (day 0) subtract an extra 7 days.
    var dayDiff = d.getDay() === 0 ? 7 : 0;

    // Get date diff in millisecs to avoid setDate() bugs with month boundaries.
    var mondayMillisecs = d.getTime() - (d.getDay() + dayDiff) * dayMillisecs;

    // Return date as YYYY-MM-DD string.
    return new Date(mondayMillisecs).toISOString().slice(0, 10);
}
1
jtschoonhoven

チェックアウト:moment.js

例:

moment().day(-7); // last Sunday (0 - 7)
moment().day(7); // next Sunday (0 + 7)
moment().day(10); // next Wednesday (3 + 7)
moment().day(24); // 3 Wednesdays from now (3 + 7 + 7 + 7)

ボーナス:node.jsでも動作します

0
pixelfreak