ฉันต้องการวิธีที่เร็วที่สุดเพื่อให้ได้วันแรกของสัปดาห์ ตัวอย่างเช่น: วันนี้คือวันที่ 11 พฤศจิกายนและวันพฤหัสบดี และฉันต้องการวันแรกของสัปดาห์นี้คือวันที่ 8 พฤศจิกายนและวันจันทร์ ฉันต้องการวิธีที่เร็วที่สุดสำหรับฟังก์ชั่นแผนที่ MongoDB ความคิดใด ๆ
ฉันต้องการวิธีที่เร็วที่สุดเพื่อให้ได้วันแรกของสัปดาห์ ตัวอย่างเช่น: วันนี้คือวันที่ 11 พฤศจิกายนและวันพฤหัสบดี และฉันต้องการวันแรกของสัปดาห์นี้คือวันที่ 8 พฤศจิกายนและวันจันทร์ ฉันต้องการวิธีที่เร็วที่สุดสำหรับฟังก์ชั่นแผนที่ MongoDB ความคิดใด ๆ
คำตอบ:
ใช้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
diff = d.getDate() - day;
d.setHours(0); d.setMinutes(0); d.setSeconds(0);
ไม่แน่ใจว่ามันเปรียบเทียบประสิทธิภาพอย่างไร แต่ได้ผล
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());
date = new Date(date);
บรรทัดแรกในฟังก์ชัน getMonday
ตรวจสอบDate.js
Date.today().previous().monday()
Date.parse('last monday');
คำตอบของ 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)
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));
มันจะทำงานได้ดี
ฉันใช้สิ่งนี้
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;
}
ฟังก์ชันนี้ใช้เวลามิลลิวินาทีปัจจุบันเพื่อลบสัปดาห์ปัจจุบันแล้วลบอีกหนึ่งสัปดาห์หากวันที่ปัจจุบันเป็นวันจันทร์ (จาวาสคริปต์นับจากวันอาทิตย์)
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;
}
ฉันได้ทดสอบเมื่อสัปดาห์ครอบคลุมจากหนึ่งเดือนไปยังอีก (และปี) และดูเหมือนว่าจะทำงานอย่างถูกต้อง
สวัสดีตอนเย็น,
ฉันต้องการเพียงแค่มีวิธีการขยายง่าย:
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);
ความนับถือ,
ในการรับวันที่วันแรกของสัปดาห์จากวันนี้คุณสามารถใช้สิ่งต่อไปนี้:
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()
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);
}
นี่คือทางออกของฉัน:
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;
}
ตอนนี้คุณสามารถเลือกวันที่โดยใช้ดัชนีอาเรย์คืน
ตัวอย่างของการคำนวณทางคณิตศาสตร์เท่านั้นโดยไม่มี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
เวอร์ชันทั่วไปเพิ่มเติมของ ... สิ่งนี้จะให้คุณทุกวันในสัปดาห์ปัจจุบันตามวันที่คุณระบุ
//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);
ตรวจสอบ: 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 ด้วย
moment().startOf('week')
moment().startOf("week")
อาจให้วันอาทิตย์ที่ผ่านมาขึ้นอยู่กับการตั้งค่าสถานที่ ในกรณีนี้ใช้moment().startOf('isoWeek')
แทน: runkit.com/embed/wdpi4bjwh6rt
startOf()
: momentjs.com/docs/#/manipulating/start-of