JavaScript - 从当前日期开始获得每周的第一天

问题描述:

我需要最快的方法来获得一周的第一天。例如,今天是11月11日和星期四,我需要将该日期转换为11月8日(星期一)。我需要MongoDB地图功能最快的方法,有什么想法?JavaScript - 从当前日期开始获得每周的第一天

+0

如果每一点速度都是至关重要的,那么您可能需要测试我的答案。我在浏览器中获得了更好的性能(IE除外,因为它支持CMS)。当然,你需要用MongoDB来测试它。当函数传递一个星期一的日期时,它应该更快,因为它只是返回未修改的原始日期。 – user113716 2010-11-11 17:06:07

+0

我得到了同样的问题,因为JavaScript日期对象有很多我现在使用的http://www.datejs.com(这里http://code.google.com/p/datejs/),一个库纠正原生日期的遗漏行为。 – lolol 2012-10-02 20:46:27

使用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 
+2

谢谢,很好的例子 – INs 2010-11-11 16:15:50

+3

这个函数有bug吗? - 如果所讨论的日期是星期四第二天,日= 4,差= 2 - 4 + 1 = -1,并且setDate的结果将是'前一个月的最后一天前一天'(参见[this] (http://www.w3schools.com/jsref/jsref_setdate.asp))。 – Izhaki 2013-05-24 12:11:12

+0

@Izhaki你是什么意思? 5月2日,函数返回4月29日,这是正确的。 – meze 2013-07-26 07:22:24

退房Date.js

Date.today().previous().monday() 
+0

或者'Date.parse('last monday');' – Anurag 2010-11-11 16:11:08

+0

我需要MongoDB数据库。所以我不能引用date.js,但感谢你的代码片段。 – INs 2010-11-11 16:18:59

+1

啊,我不知道你可以直接在MongoDB中执行JS。这很漂亮。假设您正在使用JS来准备查询数据。 – Matt 2010-11-11 16:32:24

不知道它是如何比较的性能,但这个工程。

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()); 
+4

这应该是答案,它是唯一回答问题的答案。其他人是越野车或将你引向第三方图书馆。 – OverMars 2015-03-07 23:12:34

+0

酷酷适合我!通过做出一些调整,我可以在给定日期的星期一和星期五得到这两个结果! – 2016-01-12 16:37:54

+4

这是很好的,除了这个函数应该被称为“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的太

+16

虽然这不是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)); 

这会很好用。