JavaScript - 从当前日期获取一周的第一天

IT技术 javascript algorithm
2021-02-02 12:01:57

我需要最快的方法来获得一周的第一天。例如:今天是11月11日,星期四;我想要本周的第一天,也就是 11 月 8 日,还有一个星期一。我需要 MongoDB map 函数的最快方法,有什么想法吗?

6个回答

使用getDayDate对象方法,你可以知道一周中的天数(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
顺便说一句,d.setDate 是可变的,它改变了“d”本身
2021-03-19 12:01:57
感谢您的代码@SMS。为了在一周的第一天准确地获得 0 小时,我做了一些改动。d.setHours(0); d.setMinutes(0); d.setSeconds(0);
2021-03-20 12:01:57
@Izhaki 你是什么意思?对于 5 月 2 日,该函数返回 4 月 29 日,这是正确的。
2021-03-22 12:01:57
如果星期日是一周的第一天,请使用: diff = d.getDate() - day;
2021-03-26 12:01:57
这个功能有bug吗?- 如果有问题的日期是 2 号星期四,day = 4,diff = 2 - 4 + 1 = -1,并且 setDate 的结果将是“上个月最后一天的前一天”(请参阅)。
2021-04-07 12:01:57

不确定它的性能比较如何,但这是有效的。

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());
酷它对我有用!通过进行一些调整,我很酷地从给定日期获得了每周的星期一和星期五!
2021-03-13 12:01:57
这很好,除了这个函数应该被称为“setToMonday”,因为它修改了传入的日期对象。getMonday,将返回一个新的日期,它是基于传入日期的星期一。一个微妙的区别,但在使用后抓住了我这个功能。最简单的修复方法是将其date = new Date(date);作为第一行放在 getMonday 函数中。
2021-03-13 12:01:57
这个答案是错误的,因为由于白天节省,并非所有日子都有 24 小时。它可能会意外更改您约会的时间,甚至在某些情况下返回错误的日期。
2021-03-15 12:01:57
这太棒了。getSunday 方法更简单!谢谢一堆!
2021-04-04 12:01:57
这应该是答案,它是唯一回答所问问题的答案。其他人有问题或将您推荐给第三方库。
2021-04-07 12:01:57

CMS 的答案是正确的,但假设星期一是一周的第一天。
Chandler Zwolle 的回答是正确的,但对 Date 原型进行了摆弄。
其他以小时/分钟/秒/毫秒为单位的答案是错误的。

下面的函数是正确的,将日期作为第一个参数,将所需的一周中的第一天作为第二个参数(星期日为 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)

查看Date.js

Date.today().previous().monday()
或许 Date.parse('last monday');
2021-03-15 12:01:57
像 jQuery 一样,对拉取整个库(无论多小)来访问一个简单的函数不感兴趣。
2021-03-31 12:01:57
啊,我不知道你可以直接在 MongoDB 中执行 JS。这很光滑。假设您正在使用 JS 来准备查询数据。
2021-04-03 12:01:57
我需要它用于 MongoDB 数据库。所以我不能引用 date.js,但感谢你的代码片段。
2021-04-05 12:01:57
不是一个好的解决方案,因为有国家,他们一周的第一天是星期天。
2021-04-06 12:01:57
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));

这将运作良好。