JavaScript - 从当前日期开始获得每周的第一天
我需要最快的方法来获得一周的第一天。例如,今天是11月11日和星期四,我需要将该日期转换为11月8日(星期一)。我需要MongoDB地图功能最快的方法,有什么想法?JavaScript - 从当前日期开始获得每周的第一天
使用Date对象的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
不知道它是如何比较的性能,但这个工程。
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());
这应该是答案,它是唯一回答问题的答案。其他人是越野车或将你引向第三方图书馆。 – OverMars 2015-03-07 23:12:34
酷酷适合我!通过做出一些调整,我可以在给定日期的星期一和星期五得到这两个结果! – 2016-01-12 16:37:54
这是很好的,除了这个函数应该被称为“setToMonday”,因为它修改传入的日期对象。getMonday,将返回一个新的日期,这是基于传入的日期的星期一。一个微妙的差异,但一个引起我后使用这个功能。最简单的解决方法是将'date = new Date(date);'作为getMonday函数的第一行。 – Shane 2016-12-08 23:52:48
退房: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的太
虽然这不是OP的问题的答案。他有一个日期,说08/07/14(d/m/y)。他希望得到本周的第一天(对于我的区域来说,这将是刚过去的星期一,或者昨天) 对他的问题的回答将是'moment()。startOf('week')' – 2014-07-08 13:51:41
我使用这个
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;
}
此功能使用当前毫秒时间减去当前周,再减去一个星期,如果当前日期是在周一(周日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;
}
当周从一个月跨越到另一个(也是年)我已经测试过它,它似乎正常工作。
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);
}
晚上好,
我宁愿只是有一个简单的扩展方法:
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);
问候,
这里是我的解决方案:
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;
}
Now你可以通过返回的数组索引来选择日期。
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));
这会很好用。
如果每一点速度都是至关重要的,那么您可能需要测试我的答案。我在浏览器中获得了更好的性能(IE除外,因为它支持CMS)。当然,你需要用MongoDB来测试它。当函数传递一个星期一的日期时,它应该更快,因为它只是返回未修改的原始日期。 – user113716 2010-11-11 17:06:07
我得到了同样的问题,因为JavaScript日期对象有很多我现在使用的http://www.datejs.com(这里http://code.google.com/p/datejs/),一个库纠正原生日期的遗漏行为。 – lolol 2012-10-02 20:46:27