如何在 JavaScript 中获得当前星期的第一天和最后一天

我有 today = new Date();物体。我需要得到本周的第一天和最后一天。我需要为周日和周一作为一周的开始和结束一天的变体。我现在有点搞不懂代码了。你能帮我吗?

288641 次浏览
var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6


var firstday = new Date(curr.setDate(first)).toUTCString();
var lastday = new Date(curr.setDate(last)).toUTCString();


firstday
"Sun, 06 Mar 2011 12:25:40 GMT"
lastday
"Sat, 12 Mar 2011 12:25:40 GMT"

这适用于本周的第一天 = 星期天,最后一天 = 星期六。将其扩展到周一到周日是微不足道的。

让它在不同月份的第一天和最后一天工作是留给用户的练习

你可以这么做

var today = new Date();
var startDay = 0;
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (7 - today.getDay() - startDay) % 7);

其中 startDay是一个从0到6的数字,0代表星期天(即1 = 星期一,2 = 星期二等)。

这里有一个快速获得第一天和最后一天的方法,对于任何开始的一天。 知道:

1天 = 86,400,000毫秒。

JS 日期值以毫秒为单位

食谱: 计算出你需要多少天才能得到一周的开始日(乘以1天的毫秒)。之后剩下的就是再加6天来得到你的最后一天。

var startDay = 1; //0=sunday, 1=monday etc.
var d = now.getDay(); //get the current day
var weekStart = new Date(now.valueOf() - (d<=0 ? 7-startDay:d-startDay)*86400000); //rewind to start day
var weekEnd = new Date(weekStart.valueOf() + 6*86400000); //add 6 days to get last day

您还可以使用以下代码行来获取每周的第一天和最后一天:

var curr = new Date;
var firstday = new Date(curr.setDate(curr.getDate() - curr.getDay()));
var lastday = new Date(curr.setDate(curr.getDate() - curr.getDay()+6));

希望它能派上用场。

Krtek 的方法有些错误,我测试了这个

var startDay = 0;
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (6 - today.getDay() - startDay) % 7);

很管用

SetDate将设定每月的日期。在月初和月底使用 setDate,将导致错误的一周

var curr = new Date("08-Jul-2014"); // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6
var firstday = new Date(curr.setDate(first)); // 06-Jul-2014
var lastday = new Date(curr.setDate(last)); //12-Jul-2014

如果你设定的日期是01-Jul-2014,它会显示第一天是29-Jun-2014,最后一天是05-Jun-2014,而不是05-Jul-2014

所以克服这个问题,我用

var curr = new Date();
day = curr.getDay();
firstday = new Date(curr.getTime() - 60*60*24* day*1000); //will return firstday (ie sunday) of the week
lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000); //adding (60*60*6*24*1000) means adding six days to the firstday which results in lastday (saturday) of the week

小心接受的答案,它没有设置时间为00:00:00和23:59:59,所以你可以有问题。

您可以使用第三方日期库来处理日期。例如:

var startOfWeek = moment().startOf('week').toDate();
var endOfWeek   = moment().endOf('week').toDate();

编辑: 截至2020年9月,不鼓励对新项目使用 Moment (博客文章)

另一个流行的选择是 约会

建议不错,但你昨天有个小问题。 你应该改成:

lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);

虽然这个问题似乎已经过时了,但我必须指出一个问题。
问: 2016年1月1日会发生什么?
我认为上述大多数解决方案计算的周开始时间为2016年12月27日。 因此我认为,正确的计算应该简单如下;

var d = new Date(),
dayInMs = 1000 * 60 * 60 * 24,
weekInMs = dayInMs * 7,
startOfToday = new Date(d.getFullYear(), d.getMonth(), d.getDate()).valueOf(),
todayElapsedTime = d.valueOf() - startOfToday,
dayDiff = d.getDay() * dayInMs,
dateDiff = dayDiff + todayElapsedTime,
// finally
startOfWeek = d.valueOf() - dateDiff,
endOfWeek = startOfWeek + weekInMs - 1;

我建议在这种情况下使用 Moment.js。我有过这样的场景,我必须检查当前的日期时间,这个星期,这个月和这个季度的日期时间。上面的一个答案帮助了我,所以我想分享其余的功能以及。

只需获取特定格式的当前日期时间

        case 'Today':
moment().format("DD/MM/YYYY h:mm A");


case 'This Week':
moment().endOf('isoweek').format("DD/MM/YYYY h:mm A");

如果我们仅仅使用‘ Week’作为 endOf 函数的参数,那么 Week 从星期日开始到星期六结束,但是如果要将 Sunday 作为一周的结束,我们需要使用‘ isoweek’。

        case 'This Month':
moment().endOf('month').format("DD/MM/YYYY h:mm A");


case 'This Quarter':
moment().endOf('quarter').format("DD/MM/YYYY h:mm A");

我根据自己的需要选择了这种格式。你可以根据自己的需要改变这种格式。

这种方法可以跨越年月变化。

Date.prototype.GetFirstDayOfWeek = function() {
return (new Date(this.setDate(this.getDate() - this.getDay())));
}


Date.prototype.GetLastDayOfWeek = function() {
return (new Date(this.setDate(this.getDate() - this.getDay() +6)));
}


var today = new Date();


alert(today.GetFirstDayOfWeek());


alert(today.GetLastDayOfWeek());
        //get start of week; QT
function _getStartOfWeek (date){
var iDayOfWeek = date.getDay();
var iDifference = date.getDate() - iDayOfWeek + (iDayOfWeek === 0 ?  -6:1);


return new Date(date.setDate(iDifference));
},


function _getEndOfWeek(date){
return new Date(date.setDate(date.getDate() + (7 - date.getDay()) === 7 ? 0 : (7 - date.getDay()) ));
},

* 当前日期 = = 30.06.2016星期一是一周的第一天。

它也可以在不同的月份和年份工作。 测试 qunit 套件:

enter image description here

        QUnit.module("Planung: Start of week");
QUnit.test("Should return start of week based on current date", function (assert) {
var startOfWeek = Planung._getStartOfWeek(new Date());
assert.ok( startOfWeek , "returned date: "+ startOfWeek);
});


QUnit.test("Should return start of week based on a sunday date", function (assert) {
var startOfWeek = Planung._getStartOfWeek(new Date("2016-07-03"));
assert.ok( startOfWeek , "returned date: "+ startOfWeek);
});


QUnit.test("Should return start of week based on a monday date", function (assert) {
var startOfWeek = Planung._getStartOfWeek(new Date("2016-06-27"));
assert.ok( startOfWeek , "returned date: "+ startOfWeek);
});


QUnit.module("Planung: End of week");
QUnit.test("Should return end of week based on current date", function (assert) {
var endOfWeek = Planung._getEndOfWeek(new Date());
assert.ok( endOfWeek , "returned date: "+ endOfWeek);
});
QUnit.test("Should return end of week based on sunday date with different month", function (assert) {
var endOfWeek = Planung._getEndOfWeek(new Date("2016-07-03"));
assert.ok( endOfWeek , "returned date: "+ endOfWeek);
});
QUnit.test("Should return end of week based on monday date with different month", function (assert) {
var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-27"));
assert.ok( endOfWeek , "returned date: "+ endOfWeek);
});
QUnit.test("Should return end of week based on 01-06-2016 with different month", function (assert) {
var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-01"));
assert.ok( endOfWeek , "returned date: "+ endOfWeek);
});
QUnit.test("Should return end of week based on 21-06-2016 with different month", function (assert) {
var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-21"));
assert.ok( endOfWeek , "returned date: "+ endOfWeek);
});
QUnit.test("Should return end of week based on 28-12-2016 with different month and year", function (assert) {
var endOfWeek = Planung._getEndOfWeek(new Date("2016-12-28"));
assert.ok( endOfWeek , "returned date: "+ endOfWeek);
});
QUnit.test("Should return end of week based on 01-01-2016 with different month and year", function (assert) {
var endOfWeek = Planung._getEndOfWeek(new Date("2016-01-01"));
assert.ok( endOfWeek , "returned date: "+ endOfWeek);
});
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));

这对于任何日期场景都很有用。

在所有情况下,瞬间方法都对我有效(尽管我还没有测试年底、闰年之类的界限)。如果你想从星期一开始的一周,上面的代码中只有“ isoWeek”参数更正。

    let startOfWeek = moment().startOf("isoWeek").toDate();
let endOfWeek = moment().endOf("isoWeek").toDate();

优秀(而且不可改变)的 资料库处理这一点最为简洁:

const start = startOfWeek(date);
const end = endOfWeek(date);

一周的默认开始日是星期天(0) ,但是可以像这样更改为星期一(1) :

const start = startOfWeek(date, {weekStartsOn: 1});
const end = endOfWeek(date, {weekStartsOn: 1});

只要使用纯 javascript,您就可以使用下面的函数获得一周的第一天和最后一天,并可以自由设置一周的开始日期。

var weekday = [];
weekday[0] = "Sunday";
weekday[1] = "Monday";
weekday[2] = "Tuesday";
weekday[3] = "Wednesday";
weekday[4] = "Thursday";
weekday[5] = "Friday";
weekday[6] = "Saturday";


function getFirstDayOfWeek(date, from) {
//Default start week from 'Sunday'. You can change it yourself.
from = from || 'Sunday';
var index = weekday.indexOf(from);
var start = index >= 0 ? index : 0;


var d = new Date(date);
var day = d.getDay();
var diff = d.getDate() - day + (start > day ? start - 7 : start);
d.setDate(diff);
return d;
};

一周的最后一天就是一周的第一天之后的第六天

function getLastDayOfWeek(date, from) {
from = from || 'Sunday';
var index = weekday.indexOf(from);
var start = index >= 0 ? index : 0;


var d = new Date(date);
var day = d.getDay();
var diff = d.getDate() - day + (start > day ? start - 1 : 6 + start);
d.setDate(diff);
return d;
};

测试:

getFirstDayOfWeek('2017-10-16'); //--> Sun Oct 15 2017
getFirstDayOfWeek('2017-10-16', 'Monday'); //--> Mon Oct 16 2017
getFirstDayOfWeek('2017-10-16', 'Tuesday'); //--> Tue Oct 10 2017

JavaScript

function getWeekDays(curr, firstDay = 1 /* 0=Sun, 1=Mon, ... */) {
var cd = curr.getDate() - curr.getDay();
var from = new Date(curr.setDate(cd + firstDay));
var to = new Date(curr.setDate(cd + 6 + firstDay));


return {
from,
to,
};
};

打字机

export enum WEEK_DAYS {
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
}


export const getWeekDays = (
curr: Date,
firstDay: WEEK_DAYS = WEEK_DAYS.Monday
): { from: Date; to: Date } => {
const cd = curr.getDate() - curr.getDay();
const from = new Date(curr.setDate(cd + firstDay));
const to = new Date(curr.setDate(cd + 6 + firstDay));


return {
from,
to,
};
};

我们添加了 jquery 代码,它显示从星期一到星期日的当前星期。

var d = new Date();
var week = [];
var _days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var _months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
for (let i = 1; i <= 7; i++) {
let first = d.getDate() - d.getDay() + i;
let dt = new Date(d.setDate(first));
var _day = _days[dt.getDay()];
var _month = _months[dt.getMonth()];
var _date = dt.getDate();
if(_date < 10 ){
_date = '0' +_date;
}
var _year = dt.getFullYear();
var fulldate = _day+' '+_month+' '+_date+' '+_year+' ';
week.push(fulldate);
}
console.log(week);

一个有很多答案的老问题,所以再问一个不成问题。求各种时间单位的开始和结束的一些通用函数。

对于 开始完了星期,星期的开始日默认为星期日(0) ,但任何一天都可以通过(星期一 -1,星期二 -2,等等)。不过只用公历。

这些函数不会改变源日期,因此要查看某个日期是否与其他日期(从星期一开始的一周)在同一周内:

if (d >= startOf('week', d1, 1) && d <= endOf('week', d1, 1)) {
// d is in same week as d1
}

或者从周日开始的本周:

if (d >= startOf('week') && d <= endOf('week')) {
// d is in the current week
}

// Returns a new Date object set to start of given unit
// For start of week, accepts any day as start
function startOf(unit, date = new Date(), weekStartDay = 0) {
// Copy original so don't modify it
let d = new Date(date);
let e = new Date(d);
e.setHours(23,59,59,999);
// Define methods
let start = {
second: d => d.setMilliseconds(0),
minute: d => d.setSeconds(0,0),
hour  : d => d.setMinutes(0,0,0),
day   : d => d.setHours(0,0,0,0),
week  : d => {
start.day(d);
d.setDate(d.getDate() - d.getDay() + weekStartDay);
if (d > e) d.setDate(d.getDate() - 7);
},
month : d => {
start.day(d);
d.setDate(1);
},
year  : d => {
start.day(d);
d.setMonth(0, 1);
},
decade: d => {
start.year(d);
let year = d.getFullYear();
d.setFullYear(year - year % 10);
},
century: d => {
start.year(d);
let year = d.getFullYear();
d.setFullYear(year - year % 100);
},
millenium: d => {
start.year(d);
let year = d.getFullYear();
d.setFullYear(year - year % 1000);
}
}
start[unit](d);
return d;
}


// Returns a new Date object set to end of given unit
// For end of week, accepts any day as start day
// Requires startOf
function endOf(unit, date = new Date(), weekStartDay = 0) {
// Copy original so don't modify it
let d = new Date(date);
let e = new Date(date);
e.setHours(23,59,59,999);
// Define methods
let end = {
second: d => d.setMilliseconds(999),
minute: d => d.setSeconds(59,999),
hour  : d => d.setMinutes(59,59,999),
day   : d => d.setHours(23,59,59,999),
week  : w => {
w = startOf('week', w, weekStartDay);
w.setDate(w.getDate() + 6);
end.day(w);
d = w;
},
month : d => {
d.setMonth(d.getMonth() + 1, 0);
end.day(d);
},
year  : d => {
d.setMonth(11, 31);
end.day(d);
},
decade: d => {
end.year(d);
let y = d.getFullYear();
d.setFullYear(y - y % 10 + 9);
},
century: d => {
end.year(d);
let y = d.getFullYear();
d.setFullYear(y - y % 100 + 99);
},
millenium: d => {
end.year(d);
let y = d.getFullYear();
d.setFullYear(y - y % 1000 + 999);
}
}
end[unit](d);
return d;
}


// Examples
let d = new Date();


['second','minute','hour','day','week','month','year',
'decade','century','millenium'].forEach(unit => {
console.log(('Start of ' + unit).padEnd(18)  + ': ' +
startOf(unit, d).toString());
console.log(('End of ' + unit).padEnd(18)  + ': ' +
endOf(unit, d).toString());
});

“克里斯 · 朗回答”的小改动。 如果你想星期一作为第一天使用这个。

Date.prototype.GetFirstDayOfWeek = function() {
return (new Date(this.setDate(this.getDate() - this.getDay()+ (this.getDay() == 0 ? -6:1) )));
}
Date.prototype.GetLastDayOfWeek = function() {
return (new Date(this.setDate(this.getDate() - this.getDay() +7)));
}


var today = new Date();


alert(today.GetFirstDayOfWeek());


alert(today.GetLastDayOfWeek());

谢谢@Chris Lang

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

console.log( getMonday(new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate())) )  // Mon Nov 08 2010

var currentDate = new Date();
var firstday = new Date(currentDate.setDate(currentDate.getDate() - currentDate.getDay())).toUTCString();
var lastday = new Date(currentDate.setDate(currentDate.getDate() - currentDate.getDay() + 7)).toUTCString();
console.log(firstday, lastday)

我正在使用下面的代码,但是由于. toUTCString () ,我收到了如图所示的以下错误。

如果我移除. toUTCString () . 输出,我收到的不是预期的

对于“ SHIVA”的回答有一个小小的改变,那就是“ Chris Lang”的回答有所改变。 对于星期一第一次使用与修复时,today是星期天。

Date.prototype.GetFirstDayOfWeek = function() {
return (new Date(this.setDate(this.getDate() - this.getDay()+ (this.getDay() == 0 ? -6:1) )));
}
Date.prototype.GetLastDayOfWeek = function() {
return new Date(this.setDate(this.getDate() - (this.getDay() == 0 ? 7 : this.getDay()) + 7));
}


var today = new Date();


alert(today.GetFirstDayOfWeek());


alert(today.GetLastDayOfWeek());

你也可以试试下面这个

let weekBgnDt = new Date();
let weekEndDt = new Date();
let wBeginDateLng, wEndDateLng, diffDays,dateCols=[];


if (weekBgnDt.getDay() > 0) {
diffDays = 0 - weekBgnDt.getDay();
weekBgnDt.setDate(weekBgnDt.getDate() + diffDays)
}
weekEndDt = weekEndDt.setDate(weekBgnDt.getDate() + 6)


wBeginDate = new Intl.DateTimeFormat('en-GB', { day: 'numeric', year: 'numeric',
month: '2-digit' }).format(weekBgnDt);
wEndDate = new Intl.DateTimeFormat('en-GB', { day: 'numeric', year: 'numeric', month:
'2-digit' }).format(weekEndDt);


wBeginDateLng = new Intl.DateTimeFormat('en-GB', { day: 'numeric', year: 'numeric',
month: 'long' }).format(weekBgnDt);
wEndDateLng = new Intl.DateTimeFormat('en-GB', { day: 'numeric', year: 'numeric',
month: 'long' }).format(weekEndDt);


console.log(wBeginDate, "-", wBeginDateLng)
console.log(wEndDate, "-", wEndDateLng)


for(let i=weekBgnDt;i<=weekEndDt;){
dateCols.push(new Intl.DateTimeFormat('en-GB', { day: 'numeric', year: 'numeric',
month: '2-digit' }).format(i));
i=weekBgnDt.setDate(weekBgnDt.getDate()+1)
}




console.log({wBeginDate,wBeginDateLng,wEndDate,wEndDateLng,dateCols})

结果将打印为

{ wBeginDate: “16/05/2021”,wBeginDate: “16 May 2021”,wEndDate: “22/05/2021”,wEndDateLng: “2021年5月22日”,dateCols: Array [“16/05/2021”,“17/05/2021”,“18/05/2021”,19/05/2021”,“20/05/2021”,“21/05/2021”,“22/05/2021”]}

纯粹的香草 JS。没有第三方库。

const now = new Date()
const startOfWeek = new Date(now.getFullYear(), now.getMonth(), now.getDate() - now.getDay())
const endOfWeek = new Date(now.getFullYear(), now.getMonth(), startOfWeek.getDate() + 7)

^ 这返回星期天上午00时至星期天上午00时。调整“7”以得到你想要的。

var currentDate = new Date();
var firstday = new Date(currentDate.setDate(currentDate.getDate() - currentDate.getDay())).toUTCString();
var lastday = new Date(currentDate.setDate(currentDate.getDate() - currentDate.getDay() + 6)).toUTCString();
console.log("firstday", firstday);
console.log("lastday", lastday);

正确的方法得到第一个和最后一个日期的当前一周与适当的月份和年份如下

const curr = new Date();
const first = curr.getDate() - curr.getDay() + 1; // Start from Monday
const firstDate = new Date(curr.setDate(first));
const lastDate = new Date(curr.setDate(firstDate.getDate() + 6));


console.log(firstDate.toLocaleDateString(), lastDate.toLocaleDateString());

您可以使用这个函数,它可以在不同的月份或年份中处理一周中的第一天和最后一天

const getFirstAndLastDayOfTheWeek = () => {
// The starting time is the same current
let a = new Date();
let b = new Date();
const weekDay = a.getDay();


if (weekDay === 0) {
a.setDate(a.getDate() - 6);
} else if (weekDay === 1) {
b.setDate(b.getDate() + 7 - b.getDay());
} else if (weekDay >= 1) {
a.setDate(a.getDate() - a.getDay() + 1);
b.setDate(b.getDate() + 7 - b.getDay());
}


return { firstWeekDate: a, lastWeekDate: b };
}


console.log(getFirstAndLastDayOfTheWeek());

用不同的月份和年份工作。

let wDate = new Date();
let dDay = wDate.getDay() > 0 ? wDate.getDay() : 7;
let first = wDate.getDate() - dDay + 1;
let firstDayWeek = new Date(wDate.setDate(first));
let lastDayWeek = new Date(wDate.setDate(firstDayWeek.getDate()+6));
console.log(firstDayWeek.toLocaleDateString());
console.log(lastDayWeek.toLocaleDateString());

const date = new Date();
var sub = date.getDay() > 0 ? 1 : -6;
var monday = new Date(date.setDate(date.getDate() - date.getDay() + sub));


console.log(monday.toString());

当给定日期的一周在两个月之间时,最大的问题是。(和2022-07-01一样,今天是一周的第五天。) 使用 getDay 函数,我们检查周是否介于月份之间。

注意: getDay()函数将周开始日标识为星期日,因此它将返回0作为星期日。

var curr =  new  Date(); // get current date
var weekdaynum = curr.getDay();
if(weekdaynum ==  0){ //to change sunday to the last day of the week
weekdaynum =  6;
} else{
weekdaynum = weekdaynum-1;
}
var firstweek = curr.getDate() - weekdaynum;
var lastweek = firstweek +  6; // last day is the first day + 6




if((curr.getDate()-weekdaynum) <=  0){
var firstweek_lasmonth_lastdate = new Date(currweek.getFullYear(),currweek.getMonth(), 0);
var firstweek_diff = firstweek_lasmonth_lastdate.getDate()-Math.abs(firstweek);
var firstweekday = new Date(currweek.getFullYear(),currweek.getMonth()-1,firstweek_lasmonth_lastdate.getDate()+firstweek_diff);
var lastweekday = new Date(currweek.getFullYear(),currweek.getMonth()-1,firstweek_lasmonth_lastdate.getDate()+firstweek_diff+7);
} else{
var firstweekday =  new  Date(curr.setDate(firstweek));
var lastweekday =  new  Date(curr.setDate(lastweek));
}

因此,这将返回(给定的日期是: 2022/07/01) :

firstweekday = Mon Jun 27 2022 00:00:00
lastweekday = Sun Jul 03 2022 00:00:00

希望这个能帮上忙。