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


161

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


少しずつ速度が重要な場合は、私の答えをパフォーマンステストすることをお勧めします。私のブラウザーでは、パフォーマンスが少し向上しています(CMSを支持するIEを除く)。もちろん、MongoDBでテストする必要があります。関数が月曜日の日付を渡されると、変更されていない元の日付を返すだけなので、さらに高速になります。
user113716 2010

同じ問題が発生しました。JavaScriptの日付オブジェクトには、現在使用している多くのバグがあるため、ネイティブの日付のミス動作を修正するライブラリであるdatejs.com(ここではcode.google.com/p/datejs)を使用しています。
lolol

質問のタイトルは週の最初の日を尋ね、質問の説明は最後の月曜日の日付を尋ねます。これらは実際には2つの異なる質問です。両方を正しい方法で解決する私の答えを確認してください。
Louis Ameline

回答:


322

getDayDateオブジェクトのメソッドを使用すると、曜日の数を知ることができます(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

3
この関数にはバグがありますか?-問題の日付が2日木曜日の場合、day = 4、diff = 2-4 + 1 = -1、setDateの結果は「前月の最終日の前日」になります(これを参照)。
Izhaki 2013年

2
@イザキどういう意味?5月2日の場合、関数は4月29日を返しますが、これは正しいです。
メゼ2013

14
日曜日の週、使用の最初の日である場合:diff = d.getDate() - day;
cfree

2
コード@SMSをありがとう。週の最初の日の正確な0時間を取得するために少しひねりました。d.setHours(0); d.setMinutes(0); d.setSeconds(0);
AWI

3
ちなみに、d.setDateは変更可能であり、「d」自体を変更します
Ayyash

53

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

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

または関数として:

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

setToMonday(new Date());

4
これは答えであるはずでした、それは尋ねられた質問に答える唯一のものです。その他はバグがあるか、サードパーティのライブラリを紹介します。
OverMars 2015年

かっこいい!いくつかの調整を行うことで、月曜日と金曜日の両方を特定の日付から取得できます。
alexventuraio

10
この関数は、渡された日付オブジェクトを変更するため、この関数を「setToMonday」と呼ぶ必要があることを除いて、すばらしいです。getMondayは、渡された日付に基づいて、月曜日である新しい日付を返します。微妙な違いはありますが、この機能。最も簡単な修正はdate = new Date(date);、getMonday関数の最初の行に置くことです。
シェーン

これは素晴らしいです。getSundayメソッドはさらに簡単です!本当にありがとう!
JesusIsMyDriver.dll 2017年

4
昼間の節約のためにすべての日が24時間であるとは限らないため、この答えは間違っています。日付の時間を予期せず変更したり、場合によっては間違った日を返すこともあります。
Louis Ameline

13

Date.jsを確認する

Date.today().previous().monday()

1
または多分Date.parse('last monday');
Anurag

MongoDBデータベースに必要です。そのため、date.jsを参照できませんが、コードスニペットをありがとうございます。
INは

1
ああ、私はあなたがJSをMongoDBで直接実行できることを知りませんでした。それはかなり滑らかです。JSを使用してクエリデータを準備していると想定していました。
Matt

jQueryのように、1つの単純な関数にアクセスするために、ライブラリ全体を(どんなに小さくても)プルダウンすることに関心はありません。
マフィンマン

国があるため、良い解決策ではありません。その週の最初の日は日曜日です。
Stefan Brendle

11

CMSの答えは正しいですが、月曜日が週の最初の日であると想定しています。
Chandler Zwolleの答えは正しいですが、Dateプロトタイプをいじっています。
時間/分/秒/ミリ秒で遊ぶ他の答えは間違っています。

以下の関数は正しく、最初のパラメーターとして日付を取り、2番目のパラメーターとして希望の週の最初の曜日を受け取ります(日曜日は0、月曜日は1など)。注:時、分、秒は0に設定され、その日の始まりになります。

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)


8
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));

これはうまくいきます。


4

私はこれを使っています

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;
}

3

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

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

こんばんは、

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

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

週の最初の日

今日から週の最初の日の日付を取得するには、次のようなものを使用できます。

function getUpcomingSunday() {
  const date = new Date();
  const today = date.getDate();
  const dayOfTheWeek = date.getDay();
  const newDate = date.setDate(today - dayOfTheWeek + 7);
  return new Date(newDate);
}

console.log(getUpcomingSunday());

または、今日から週の最後の日を取得するには:

function getLastSunday() {
  const date = new Date();
  const today = date.getDate();
  const dayOfTheWeek = date.getDay();
  const newDate = date.setDate(today - (dayOfTheWeek || 7));
  return new Date(newDate);
}

console.log(getLastSunday());

*タイムゾーンによっては、週の始まりは日曜日に開始する必要はありません。金曜日、土曜日、月曜日、またはマシンが設定されているその他の日に開始できます。それらの方法はそれを説明します。

*次のtoISOStringような方法でフォーマットすることもできます:getLastSunday().toISOString()


1

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

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

これが私の解決策です:

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;
}

これで、返された配列インデックスによって日付を選択できます。


0

数学的な計算のみの例で、Date関数はありません。

const date = new Date();
const ts = +date;

const mondayTS = ts - ts % (60 * 60 * 24 * (7-4) * 1000);

const monday = new Date(mondayTS);
console.log(monday.toISOString(), 'Day:', monday.getDay());

const formatTS = v => new Date(v).toISOString();
const adjust = (v, d = 1) => v - v % (d * 1000);

const d = new Date('2020-04-22T21:48:17.468Z');
const ts = +d; // 1587592097468

const test = v => console.log(formatTS(adjust(ts, v)));

test();                     // 2020-04-22T21:48:17.000Z
test(60);                   // 2020-04-22T21:48:00.000Z
test(60 * 60);              // 2020-04-22T21:00:00.000Z
test(60 * 60 * 24);         // 2020-04-22T00:00:00.000Z
test(60 * 60 * 24 * (7-4)); // 2020-04-20T00:00:00.000Z, monday

// So, what does `(7-4)` mean?
// 7 - days number in the week
// 4 - shifting for the weekday number of the first second of the 1970 year, the first time stamp second.
//     new Date(0)          ---> 1970-01-01T00:00:00.000Z
//     new Date(0).getDay() ---> 4


0

これのより一般化されたバージョン...これは、指定した日付に基づいて、今週の任意の日を提供します。

//returns the relative day in the week 0 = Sunday, 1 = Monday ... 6 = Saturday
function getRelativeDayInWeek(d,dy) {
  d = new Date(d);
  var day = d.getDay(),
      diff = d.getDate() - day + (day == 0 ? -6:dy); // adjust when day is sunday
  return new Date(d.setDate(diff));
}

var monday = getRelativeDayInWeek(new Date(),1);
var friday = getRelativeDayInWeek(new Date(),5);

console.log(monday);
console.log(friday);


-1

チェックアウト: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でも動作します


18
しかし、それはOPの質問に対する答えではありません。彼は日付を持っています、例えば08/07/14(d / m / y)と言います。彼は一瞬で彼の質問への答えは次のようになります(私のロケールのために、これは単なる通過した月曜日、または昨日になります)この週の最初の曜日を取得したいmoment().startOf('week')
イェルーンPelgrims

moment().startOf("week")ロケール設定によっては、前の日曜日の日付が表示される場合があることに注意してください。その場合は、moment().startOf('isoWeek')代わりにrunkit.com/embed/wdpi4bjwh6rt
Harm te

PSドキュメントstartOf()momentjs.com/docs
Harm te
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.