用JavaScript计算上周开始日期(不是-7天前)

用JavaScript计算上周开始日期(不是-7天前),javascript,date,datetime,Javascript,Date,Datetime,我有一个活动记录列表,所有这些记录都有一个日期并显示在活动流中 我想在记录之间插入一个分隔符DIV,该分隔符DIV基于记录的创建日期,它们属于哪个日期组 我想显示一个DIV,其中包含文本This week,该DIV将取当前一周的开始日期(不是过去7天),然后我可以显示自该日期以来创建的所有记录 我还想为上周做一个,这意味着我需要获取上周开始日期和上周结束日期的日期值。或者开始日期+7就可以了 然后我有一个JavaScript库来比较日期范围。我可以输入开始日期和结束日期,并确定第三个日期是否在日

我有一个活动记录列表,所有这些记录都有一个日期并显示在活动流中

我想在记录之间插入一个分隔符DIV,该分隔符DIV基于记录的创建日期,它们属于哪个日期组

我想显示一个DIV,其中包含文本This week,该DIV将取当前一周的开始日期(不是过去7天),然后我可以显示自该日期以来创建的所有记录

我还想为上周做一个,这意味着我需要获取上周开始日期和上周结束日期的日期值。或者开始日期+7就可以了

然后我有一个JavaScript库来比较日期范围。我可以输入开始日期和结束日期,并确定第三个日期是否在日期范围内,这将让我知道在每个日期部分下显示哪些记录

因此,我请求帮助计算:

在大多数日历中,一周的开始日期是星期天或星期一

  • 本周开始日期
  • 上周开始日期和结束日期
此外,如果我能帮忙的话,我不想在这些日期操作中使用庞大的in size Moment.js库

谢谢你的帮助

下图显示了我试图通过日期部分来打破我的记录


用于日期时间比较和检查日期是否在两个日期之间的日期库

// Source: http://stackoverflow.com/questions/497790
var dates = {
  convert: function(d) {
    // Converts the date in d to a date-object. The input can be:
    //   a date object: returned without modification
    //  an array      : Interpreted as [year,month,day]. NOTE: month is 0-11.
    //   a number     : Interpreted as number of milliseconds
    //                  since 1 Jan 1970 (a timestamp)
    //   a string     : Any format supported by the javascript engine, like
    //                  "YYYY/MM/DD", "MM/DD/YYYY", "Jan 31 2009" etc.
    //  an object     : Interpreted as an object with year, month and date
    //                  attributes.  **NOTE** month is 0-11.
    return (
      d.constructor === Date ? d :
      d.constructor === Array ? new Date(d[0], d[1], d[2]) :
      d.constructor === Number ? new Date(d) :
      d.constructor === String ? new Date(d) :
      typeof d === "object" ? new Date(d.year, d.month, d.date) :
      NaN
    );
  },
  compare: function(a, b) {
    // Compare two dates (could be of any type supported by the convert
    // function above) and returns:
    //  -1 : if a < b
    //   0 : if a = b
    //   1 : if a > b
    // NaN : if a or b is an illegal date
    // NOTE: The code inside isFinite does an assignment (=).
    return (
      isFinite(a = this.convert(a).valueOf()) &&
      isFinite(b = this.convert(b).valueOf()) ?
      (a > b) - (a < b) :
      NaN
    );
  },
  inRange: function(d, start, end) {
    // Checks if date in d is between dates in start and end.
    // Returns a boolean or NaN:
    //    true  : if d is between start and end (inclusive)
    //    false : if d is before start or after end
    //    NaN   : if one or more of the dates is illegal.
    // NOTE: The code inside isFinite does an assignment (=).
    return (
      isFinite(d = this.convert(d).valueOf()) &&
      isFinite(start = this.convert(start).valueOf()) &&
      isFinite(end = this.convert(end).valueOf()) ?
      start <= d && d <= end :
      NaN
    );
  },

  // Subtract number of months from current month
  // dates.subtractMonth(1)
  subtractMonth: function(numberOfMonths) {
    //var d = this;
    var d = new Date();
    d.setMonth(d.getMonth() - numberOfMonths);
    d.setDate(1);
    return d;
  }

};

///////////////////////////////////////////////////////////////////////////
首先,subtractMonth函数有缺陷,对于3月31日减去1个月,它返回3月1日

如果要为给定日期查找一周的第一天,只需从星期天开始的几周的日期中减去天数,或从星期一开始的几周中减去一天或6天:

/**
**  @param {Date} date - date to get start of week for
**  @param {Boolean} mondayStart - falsey for Sunday as first day of week,
**                                 truthy for Monday as first day of week
**  @returns {Date} - date for first day of week
*/
function getStartOfWeek(date, mondayStart) {

  // copy date
  var d = new Date(+date);
  // days to previous Sunday
  var shift = d.getDay();

  // Adjust shift if week starts on Monday
  if (mondayStart) {
    shift = shift? shift - 1 : 6;
  }

  // Shift to start of week
  d.setDate(d.getDate() - shift);
  return d;
}
如果您希望减法月函数工作,请说明您希望它做什么

编辑 作为一项额外功能,这里有一个减法月函数,它的工作方式与我认为的工作方式相同:

/*
** @param {number} numberOfMonths - number of months to add to date
** @param {Date} date - date to subract months from
** @returns {Date} - the passed in date object with the specified number of months subtracted
*/
function subtractMonth (numberOfMonths, date) {

  // If date not supplied, default to today
  var d = date || new Date();

  // Get the date
  var day = d.getDate();

  // Subtract the months
  d.setMonth(d.getMonth() - numberOfMonths);

  // If date has changed, was too big for month and has rolled over
  // into next month, so set to last day of previous month
  if (day != d.getDate) d.setDate(0);
  return d;
}

只需从月日减去1,直到date对象告诉您周日是您希望的周初。@Pointy谢谢,我没有想到这一点!还有一次,我减去以得到本周的开始时间,然后我可以简单地减去7天以得到上周的开始时间,等等……这比我想象的要容易得多,谢谢JavaScript日期的东西不是很复杂,但确实很容易做像这样的简单事情:)太好了,谢谢,它们为我的小约会库增添了不少内容。减法月份函数似乎工作得很好,因为它有正确的月份结束日期。一开始我不确定的一件事是,例如,从现在开始减去1个月,显示7月31日。由于我们快到9月中旬了,看起来就像8月一样,但我意识到这是一个棘手的问题,因为许多人会有不同的需求。最后,我仍然不能100%确定我的最终结果需要什么,但是…继续…使用我的
日期。在range(d,start,end)
函数中插入这些新的日期值,同时迭代上面的JSON,我可以确定每条记录的位置<代码>昨天,
本周
上周
,“本月早些时候”
,“上个月”
。一旦我得到了所需的日期值,我仍然不确定如何在记录之间插入1个日期标题。例如,如果5条记录都属于
本周
的范围,我只需要在这5条记录的上方插入日期标题
本周
。在那5张唱片之后,它可能会变成一张上周属于
的唱片
…我甚至不确定我是否有意义。我上面贴的图片可能比文字更能说明问题。您的代码是缺少的部分,所以谢谢您!我在想也许我可以做一个
开关()
,把我的每个日期条件都放进去。然后,我的JSON记录日期将被传递到交换机中,并将确定它是否适合(本周、上周等)。你有什么想法我可以插入yhis日期标题DIV为每个组,它将在每个记录的顶部,属于它。我这里有一个小提琴我的JSON被迭代和所有这些日期函数玩。我的想法是为每个日期部分创建一个标志变量,一旦1条JSON记录匹配,我就设置标志,指示该日期部分标题不再需要创建。
/*
** @param {number} numberOfMonths - number of months to add to date
** @param {Date} date - date to subract months from
** @returns {Date} - the passed in date object with the specified number of months subtracted
*/
function subtractMonth (numberOfMonths, date) {

  // If date not supplied, default to today
  var d = date || new Date();

  // Get the date
  var day = d.getDate();

  // Subtract the months
  d.setMonth(d.getMonth() - numberOfMonths);

  // If date has changed, was too big for month and has rolled over
  // into next month, so set to last day of previous month
  if (day != d.getDate) d.setDate(0);
  return d;
}