JavaScript - รับวันแรกของสัปดาห์จากวันที่ปัจจุบัน


161

ฉันต้องการวิธีที่เร็วที่สุดเพื่อให้ได้วันแรกของสัปดาห์ ตัวอย่างเช่น: วันนี้คือวันที่ 11 พฤศจิกายนและวันพฤหัสบดี และฉันต้องการวันแรกของสัปดาห์นี้คือวันที่ 8 พฤศจิกายนและวันจันทร์ ฉันต้องการวิธีที่เร็วที่สุดสำหรับฟังก์ชั่นแผนที่ MongoDB ความคิดใด ๆ


หากความเร็วทุกเล็กน้อยเป็นสิ่งสำคัญคุณอาจต้องการทดสอบประสิทธิภาพคำตอบของฉัน ฉันได้รับประสิทธิภาพที่ดีขึ้นเล็กน้อยกับเหมืองในเบราว์เซอร์ (ยกเว้น IE ซึ่งเป็นที่โปรดปราน CMS) แน่นอนคุณจะต้องทดสอบกับ MongoDB เมื่อฟังก์ชั่นได้รับวันที่ที่เป็นวันจันทร์มันควรจะเร็วขึ้นเพราะมันแค่ส่งคืนวันที่ดั้งเดิมที่ไม่ได้แก้ไข
user113716

ฉันมีปัญหาเดียวกันและเนื่องจากวัตถุวันที่จาวาสคริปต์มีข้อบกพร่องมากมายที่ฉันใช้ตอนนี้datejs.com (ที่นี่code.google.com/p/datejs ) ห้องสมุดที่แก้ไขพฤติกรรมพลาดของวันที่ดั้งเดิม
lolol

ชื่อคำถามถามในวันแรกของสัปดาห์ในขณะที่คำอธิบายคำถามถามถึงวันจันทร์สุดท้าย นี่เป็นคำถามที่แตกต่างกันสองข้อ ตรวจสอบคำตอบของฉันที่แก้พวกเขาทั้งสองอย่างถูกต้อง
Louis Ameline

คำตอบ:


322

ใช้getDayวิธีการของวัตถุวันที่คุณสามารถทราบจำนวนวันของสัปดาห์ (เป็น 0 = วันอาทิตย์ 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, วัน = 4, diff = 2 - 4 + 1 = -1 และผลลัพธ์ของ setDate จะเป็น 'วันก่อนวันสุดท้ายของเดือนก่อน' (ดูสิ่งนี้ )
Izhaki

2
@Izhaki คุณหมายถึงอะไร สำหรับวันที่ 2 พฤษภาคมฟังก์ชันจะคืนค่า 29 เมษายนซึ่งถูกต้อง
meze

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

มันยอดเยี่ยมสำหรับฉัน! โดยการปรับเปลี่ยนบางอย่างฉันได้รับทั้งวันจันทร์และวันศุกร์ของสัปดาห์จากวันที่กำหนด!
alexventuraio

10
นี่ยอดเยี่ยมยกเว้นฟังก์ชั่นนี้ควรเรียกว่า "setToMonday" เนื่องจากมันแก้ไขวัตถุวันที่ที่ผ่านมา getMonday จะคืนค่าวันที่ใหม่ซึ่งเป็นวันจันทร์ตามวันที่ที่ผ่านไปความแตกต่างที่ลึกซึ้ง แต่สิ่งหนึ่งที่จับฉันหลังจากใช้งาน ฟังก์ชั่นนี้ การแก้ไขที่ง่ายที่สุดคือใส่date = new Date(date);บรรทัดแรกในฟังก์ชัน getMonday
เชน

นี่มันเจ๋งมาก. วิธีการ getSunday ง่ายยิ่งขึ้น! ขอบคุณมัด!
JesusIsMyDriver.dll

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 ไม่สนใจดึงทั้งไลบรารีลงมา (ไม่ว่าเล็กแค่ไหน) เพื่อเข้าถึงฟังก์ชั่นง่ายๆ
มัฟฟินแมน

ไม่ใช่ทางออกที่ดีเพราะมีหลายประเทศวันแรกของสัปดาห์คือวันอาทิตย์
Stefan Brendle

11

คำตอบของ CMS นั้นถูกต้อง แต่สมมติว่าวันจันทร์เป็นวันแรกของสัปดาห์
คำตอบของ Chandler Zwolle นั้นถูกต้อง แต่เล่นซอกับต้นแบบวันที่
คำตอบอื่น ๆ ที่เล่นกับชั่วโมง / นาที / วินาที / มิลลิวินาทีผิด

ฟังก์ชั่นด้านล่างถูกต้องและใช้วันที่เป็นพารามิเตอร์ตัวแรกและวันแรกของสัปดาห์ที่ต้องการเป็นพารามิเตอร์ที่สอง (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

ฟังก์ชันนี้ใช้เวลามิลลิวินาทีปัจจุบันเพื่อลบสัปดาห์ปัจจุบันแล้วลบอีกหนึ่งสัปดาห์หากวันที่ปัจจุบันเป็นวันจันทร์ (จาวาสคริปต์นับจากวันอาทิตย์)

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

ฉันได้ทดสอบเมื่อสัปดาห์ครอบคลุมจากหนึ่งเดือนไปยังอีก (และปี) และดูเหมือนว่าจะทำงานอย่างถูกต้อง


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

ตอนนี้ถ้าสัปดาห์ของคุณเริ่มต้นในวันอาทิตย์ให้ส่งผ่าน "0" สำหรับพารามิเตอร์ pStartOfWeek เช่น:

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

หากสัปดาห์ของคุณเริ่มต้นในวันจันทร์ให้ส่งผ่าน "1" สำหรับพารามิเตอร์ pStartOfWeek:

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 () มีปัญหากับขอบเขตเดือนที่ระบุไว้ในความคิดเห็นข้างต้น วิธีแก้ปัญหาที่สะอาดคือการค้นหาความแตกต่างของวันที่โดยใช้การประทับเวลาของยุคแทนที่จะใช้วิธีการ กล่าวคือ

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')
Jeroen Pelgrims

โปรดทราบว่าmoment().startOf("week")อาจให้วันอาทิตย์ที่ผ่านมาขึ้นอยู่กับการตั้งค่าสถานที่ ในกรณีนี้ใช้moment().startOf('isoWeek')แทน: runkit.com/embed/wdpi4bjwh6rt
Harm te Molder

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.