获取前一个星期一的JavaScript

获取前一个星期一的JavaScript,javascript,date,Javascript,Date,我希望前一个星期一出现在用户输入今天日期的字段中 例如:如果输入了今天的日期2016年1月29日,则代码将改为显示前一个星期一的日期(即2016年1月25日) 我在网上看到了一些代码: function getPreviousMonday() { var date = new Date(); if (date.getDay() != 0) { return new Date().setDate(date.getDate() - 7 - 6); } else { ret

我希望前一个星期一出现在用户输入今天日期的字段中

例如:如果输入了今天的日期
2016年1月29日
,则代码将改为显示前一个星期一的日期(即2016年1月25日)

我在网上看到了一些代码:

function getPreviousMonday() {
  var date = new Date();
  if (date.getDay() != 0) {
    return new Date().setDate(date.getDate() - 7 - 6);
  } else {
    return new Date().setDate(date.getDate() - date.getDate() - 6);
  }
}

然而,这不是很有效,为什么?

我认为你的数学有点不对劲,我整理了你的语法

function getPreviousMonday()
{
    var date = new Date();
    var day = date.getDay();
    var prevMonday = new Date();
    if(date.getDay() == 0){
        prevMonday.setDate(date.getDate() - 7);
    }
    else{
        prevMonday.setDate(date.getDate() - (day-1));
    }

    return prevMonday;
}

这样,你总是能看到发生的最后一个星期一(如果今天是星期一,那是7天前)

这里有一把小提琴演示了几种不同的格式:

function getMonday(d) {
  var m_names = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
  var d = new Date(d);
  var day = d.getDay(),
      diff = d.getDate() - day + (day == 0 ? -6:1); // adjust when day is sunday

  //Use this one to return this format: Mon Jan 25 2016 09:37:51 GMT-0600 (Central Standard Time)
  //return new Date(d.setDate(diff));

  //Use this one to return this format: Mon, 25 Jan 2016
  //monday=new Date(d.setDate(diff)).toUTCString();
  //monday=monday.split(' ').slice(0, 4).join(' ')
  //return monday;

  //Use this one to return this format: 25-Jan-2016
  monday=new Date(d.setDate(diff));
  var curr_date = monday.getDate();
  var curr_month = monday.getMonth();
  var curr_year = monday.getFullYear();
  return curr_date + "-" + m_names[curr_month] + "-" + curr_year;
}

alert(getMonday(new Date()));

//Created with help from:
//http://stackoverflow.com/a/27480352/3112803
//http://stackoverflow.com/a/4156516/3112803
//http://stackoverflow.com/a/27869948/3112803

我有点晚了,但我喜欢这个解决方案。这是一条单行线,没有那么复杂。对我来说,为它创建一个函数似乎有些过分。

最简单的解决方案是根据今天的日期返回天数。例如,如果今天(0)是星期天,则可以返回6天以查找上一个星期一。如果今天是星期一,你可以回去7天。因此,在这种情况下,使用模将对您有所帮助,因为您需要返回的天数是%7加6。 让我用简单的步骤把它分解

var today=new Date();
这会给你今天的日期。现在,

var todaysDay=today.getDay();
这会让你的一天从零开始

var goBack=today.getDay()%7+6;
现在,宣布一个新的日期

var lastMonday=new Date().setDate(today.getDate()-goBack);
现在,这将为您提供一个数字日期值。将其转换回最新版本

var desiredDate=new Date(lastMonday);

感谢@Philippe Dubé-Tremblay提供的出色解决方案(如上所述),

我将在这里为那些像我一样计划重复调用这个函数的人提供包装函数

// Accepts a date as parameter or with no parameter will assume the current date.
const getPreviousMonday = (date = null) => {
  const prevMonday = date && new Date(date.valueOf()) || new Date()
  prevMonday.setDate(prevMonday.getDate() - (prevMonday.getDay() + 6) % 7)
  return prevMonday
}
使用moment.js:

moment().day("Monday").format('YYYY-MM-DD');

基于@Philippe Dubé-Tremblay的回答,我想提出一些可以让你瞄准前一天的东西:

let target=1//Monday
let date=新日期()
date.setDate(date.getDate()-(date.getDay()==target?7:(date.getDay()+(7-target))%7))

这考虑到了前一个星期一,如果今天也是星期一

上述解决方案对我不起作用

在@Philippe Dubé-Tremblay的解决方案中,如果今天已经是星期一,它将在当天返回

function getPreviousMonday() : Date {
    let date = new Date();
    let day = date.getDay();
    let prevMonday = new Date();
    if(day == 0 || day == 1){
         prevMonday.setDate(date.getDate() - (day + 6));
    }
    else{
        prevMonday.setDate(date.getDate() - (day - 1));
    }
    return prevMonday;
}

 if (day == 1) {
  prevMonday.setDate(date.getDate() - 7);
}
else {
  prevMonday.setDate(date.getDate() - (day + 6) % 7);;
}

这对我有用

可能重复或重复我编辑了答案,以包括第三种格式,并为帮助生成此答案的源代码提供道具。希望这有帮助。我知道你是stackoverflow新手,如果这对你有效,请将此标记为答案。这是不正确的-如果今天是星期三(3),那么你将执行
(3%7)+6=9
。您不需要返回9天,而是2天。正确的公式是
(3+6)%7=2
。例如,
goBack=(today.getDay()+6)%7
这为我返回了一个数字,而不是一个日期。这将返回自纪元以来的时间(我相信),而不是实例化新的日期对象,然后进行更改。试图流畅地做这件事不会产生你所期望的结果。(这是一个日期对象,而不是返回一个整数)执行
newdate(prevMonday)它将返回datedate.getDay()为0返回星期天,而不是星期一。。。我喜欢下面@Philippe Dubé-Tremblay的答案。谢谢@Philippe提供的好解决方案。我在这里放置了一个包装函数,该函数为感兴趣的人接受一个日期。它的工作原理如下:将6天添加到
getDay()
(一周中的当前日期,例如星期五=5),然后从当前的天数(例如
29-4=25
)中减去除以一周天数的剩余部分(
(5+6)%7=4
)。如果今天是星期天,那么这不应该给你一个星期天的时间吗?
2020-05-10
,而预期的时间是,
2020-05-03
谢谢,只是一个小小的反馈:与其说我们是星期一,不如说我们是星期一(只是为了避免林特闪烁:))谢谢你的主意@Braulio,我更新了答案:)如果我们是星期一,我的解决方案将获得当前日期。因此,如果你想要相同的数学,用(7-target)替换硬编码的6应该可以。如果你想知道最后一个星期一的情况,我想那些数学运算是:date.setDate(date.getDate()-(date.getDay()+(6-target)%7+1@Philippe Dubé-Tremblay,很简单,但是如果我尝试你的更新,它会在两周前出现,而不是本周今天在星期四运行时,您的代码将在两个星期二之前而不是从本周开始的星期二捕获。我认为:date.setDate(date.getDate()-(date.getDay()+6-target)%7+1
 if (day == 1) {
  prevMonday.setDate(date.getDate() - 7);
}
else {
  prevMonday.setDate(date.getDate() - (day + 6) % 7);;
}