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


161

我需要最快的方式来获得一周的第一天。例如:今天是11月11日,是星期四;我想要本周的第一天(11月8日)和一个星期一。我需要用于MongoDB地图功能的最快方法,有什么想法吗?


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

我遇到了同样的问题,因为javascript日期对象现在有很多bug,我现在使用的是datejs.com(此处为code.google.com/p/datejs),该库可纠正本机日期的遗漏行为。
哈哈,2012年

问题标题要求输入一周的第一天,而问题描述要求输入最后一个星期一的日期。这实际上是两个不同的问题。检查我的答案是否可以正确解决它们。
路易·阿梅琳

Answers:


322

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

3
这个功能有错误吗?-如果有问题的日期是周四2日,天= 4,DIFF = 2 - 4 + 1 = -1,和的setDate的结果将是“一天前一个月的最后一天之前”(见)。
伊扎基

2
@Izhaki是什么意思?对于5月2日,该函数返回4月29日,这是正确的。
2013年

14
如果星期日是一周的第一天,请使用:diff = d.getDate() - day;
cfree

2
感谢您的代码@SMS。我在一周的第一天正好是0个小时做了一些修改。d.setHours(0); d.setMinutes(0); d.setSeconds(0);
Awi

3
顺便说一句,d.setDate是可变的,它改变了“ d”本身
Ayyash

53

不确定如何比较性能,但是可以。

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

4
这应该是答案,它是回答所问问题的唯一答案。其他人则是越野车或将您引荐给第三方库。
OverMars

酷对我有用!通过进行一些调整,我可以很酷地从给定日期获得一周中的星期一和星期五!
alexventuraio

10
很棒,除了此函数应被称为“ setToMonday”,因为它修改了传入的日期对象。getMonday,将基于传入的日期返回一个新的Date,该日期为星期一。此功能。最简单的解决方法是将date = new Date(date);getMonday函数作为第一行。
Shane

这太棒了。getSunday方法甚至更容易!谢谢一群!
JesusIsMyDriver.dll

4
这个答案是错误的,因为由于节省了白天,并非所有的一天都有24小时。它可能会意外更改日期的小时,甚至在某些情况下还会返回错误的日期。
路易·阿梅琳

13

查看Date.js

Date.today().previous().monday()

1
或许是Date.parse('last monday');
Anurag

我需要MongoDB数据库。因此,我无法引用date.js,但感谢您的代码段。
诸IN

1
啊,我不知道您可以直接在MongoDB中执行JS。真漂亮 假设您正在使用JS准备查询数据。
马特2010年

像jQuery一样,对拉下整个库(无论大小如何)以访问一个简单函数不感兴趣。
松饼人

这不是一个很好的解决方案,因为有一些国家/地区,其一周的第一天是星期日。
Stefan Brendle

11

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)


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

这样会很好用。


4

我正在用这个

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

3

此函数使用当前毫秒时间减去当前星期,如果当前日期是星期一,则再减去一个星期(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;
}

当一周从一个月跨到另一个月(以及几年)时,我已经对其进行了测试,它似乎可以正常工作。


3

晚上好,

我更喜欢只有一个简单的扩展方法:

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

问候,


2

一周的第一天

要获取从今天开始的一周中第一天的日期,您可以使用类似以下的方法:

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()


1

setDate()存在月边界的问题,上面的注释中对此进行了说明。一个干净的解决方法是使用纪元时间戳而不是Date对象上的(令人惊讶的违反直觉的)方法来查找日期差。即

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

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

现在,您可以按返回的数组索引选择日期。


0

没有任何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


0

更为通用的版本...这将根据您指定的日期为您提供当前周的任意一天。

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


-1

检出: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


18
但是,这并不是对OP问题的答案。他有个约会,比如说08/07/14(d / m / y)。他想获得本周的第一天(对于我的语言环境,这将是刚刚过去的星期一,或者是昨天),他的问题moment().startOf('week')
随即

请注意,这moment().startOf("week")可能会给出上一个星期日的日期,具体取决于语言环境设置。在这种情况下,请moment().startOf('isoWeek')改用:runkit.com/embed/wdpi4bjwh6rt
Harm te Molder

PS文件startOf()momentjs.com/docs
Harm te
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.