如何用momentjs计算当月的最后一个星期五

时间:2014-03-14 09:32:59

标签: javascript momentjs

如何使用momentjs api计算本月的最后一个星期五?

5 个答案:

答案 0 :(得分:4)

正确回答这个问题:

var lastFriday = function () {
  var lastDay = moment().endOf('month');
  if (lastDay.day() >= 5)
   var sub = lastDay.day() - 5;
  else
   var sub = lastDay.day() + 2;
  return lastDay.subtract(sub, 'days');
}

如果该月的最后一天是星期五,则上一个答案将返回上周五的下一个答案。

答案 1 :(得分:2)

考虑到你想要上个星期五的月份:

var lastFridayForMonth = function (monthMoment) {
  var lastDay = monthMoment.endOf('month').startOf('day');
  switch (lastDay.day()) {
    case 6:
      return lastDay.subtract(1, 'days');
    default:
      return lastDay.subtract(lastDay.day() + 2, 'days');
  }
},

E.g。

// returns moment('2014-03-28 00:00:00');
lastFridayForMonth(moment('2014-03-14));

答案 2 :(得分:1)

我尝试了多个月的测试,几个月以上的回答@afternoon没有用。下面是测试代码。(一个这样的测试是2018年8月)

var moment  = require('moment')
var affirm  = require("affirm.js")
var cc = moment(Date.now())
for (var i = 0; i < 100000; i++) {
    lastFridayForMonth(cc)
    var nextWeek = moment(cc).add(7, 'days')
    console.log(cc.format("ddd DD MMM YYYY"), nextWeek.format('MMM'))
    affirm((cc.month() - nextWeek.month()) === -1 || (cc.month() - nextWeek.month()) === 11, "1 month gap is not found")
    affirm(cc.day() === 5, "its not friday")
    cc.add(1, "months")
}

我已经提出了另一种解决方案

function lastFridayForMonth(monthMoment) {
    var month = monthMoment.month()
    monthMoment.endOf("month").startOf("isoweek").add(4, "days")
    if (monthMoment.month() !== month) monthMoment.subtract(7, "days")
}

答案 3 :(得分:1)

对不起家伙,但我测试了之前的答案,但都错了。

检查所有这些

  

矩([2017,2])

你会发现结果不正确。

我写了这个迄今为止有效的解决方案:

&#13;
&#13;
let date = moment([2017,2]).endOf('month'); 

while (date.day() !== 5) { 
  date.subtract(1,'days')
}

return date;
&#13;
&#13;
&#13;

答案 4 :(得分:0)

更短的答案:

var lastFridayForMonth = function (monthMoment) {
    let lastDay = monthMoment.endOf('month').endOf('day');
    return lastDay.subtract((lastDay.day() + 2) % 7, 'days');
}