如何使用时刻找到18个月前的第一个星期一

时间:2016-01-13 21:23:30

标签: javascript momentjs

我正在写一些javascript并遇到了时刻库。我想利用这个时刻来获得18个月前的第一个星期一。我该怎么办?

我知道18个月前它是

 moment().subtract(18, 'months');

但我怎么知道那个时间的第一个星期一。

提前致谢!

6 个答案:

答案 0 :(得分:1)

更干净,更可重复使用恕我直言;)

var monday = moment().day('Monday').weekday(); 

var searchFirstMonday = moment().subtract(18, 'months').startOf('month');

while (searchFirstMonday.weekday() !== monday){ 
  searchFirstMonday.add(1, 'day'); 
}

答案 1 :(得分:1)

您可以在一行中完成此操作。

moment().subtract(18,'months').startOf('month').add(6 - moment().day("Monday").day() ,'days').startOf('week').day(1);

找到18个月前的那一刻,获取该月的开始日期,添加6天,因为在最坏的情况下,该月的第一个是星期二(导致包含第一个星期一的一周中的日期)和然后开始那一周。

Voila,一条线。

第1次修改:将计算更正为与区域设置无关,并且始终返回星期一而不是星期的开始,因为这取决于区域设置。

第二次修改:语言环境使它变得有点复杂。使用星期六在星期六结束的语言环境添加6天将进入另一周,因此我们需要调整算法以考虑周一周数,即减去moment().day("Monday").day(),这给出了依赖于语言环境的工作日星期一(0或1)的编号。在上面的代码中更改了。

答案 2 :(得分:0)

如果你回到18个月,那个月的第一天,那个周的那个星期一,你就会接近:

moment().subtract(18, 'months').startOf('month').day(1)

为确保星期一在正确的月份,你需要稍微打破一下:

var month = moment().subtract(18, 'months');
var firstMonday = month.startOf('month').day(1);
if (firstMonday.month() != month.month()) {
  firstMonday = firstMonday.add(7, 'days');
}

答案 3 :(得分:0)

如果有人想要在没有任何库的情况下做同样的事情。 不确定这是否是最好的方法:P

var now = new Date();

//Get year and month
var month = now.getMonth();
var year = now.getFullYear();

//Months to go back
var monthsIntoPast = 18;

//Day of week we're looking for
var firstWeekDay= 2;

//Loop for one week
for(var x = 0; x < 7; x++) {

    //Go back 18 months to first day + x of the month
    var past = new Date(year, month - monthsIntoPast, 2 + x);

    //First monday
    if(past.getDay() == firstWeekDay) {

        //First monday 18 months ago
        alert(past.toUTCString())
        break;
    }
}

答案 4 :(得分:0)

var moment = require('moment');
date = moment().subtract(18, 'months').startOf('month');

首先我们得到当前日期并减去18个月。然后我们找到了本月的开始,截至今天是

_d: Tue Jul 01 2014 00:00:00 GMT-0800 (AKDT),

所以现在我们需要调整下周一。我们用date.day()得到当天的当天,这将给出一个0-7之间的数字,其中0表示上周日,7表示下周日。在这种情况下,第一个是在星期二。

>date.day();
2

所以我们取一周的偏差并从8减去它。为什么你说8?因为如果计算包括0和7在内的每个数字,则有8个数字。 (想想阵列)

//since it's not monday we add the offset
date = date.add(8-date.day(), 'days');

在您的代码中,您要检查第一天是否返回实际上是星期一,以便不能获得该月的第二个星期一。所以整个事情看起来像

date = moment().subtract(18, 'months').startOf('month');
if(date.day() > 1){ //check if it's Monday
  //since it's not monday we add the offset
  date = date.add(8-date.day(), 'days');  
}

返回

_d: Mon Jul 07 2014 00:00:00 GMT-0800 (AKDT),

答案 5 :(得分:0)

您可以使用以下代码获取所需内容:

// Subtract 18 months from the current date, then get the first day of the month
var date = moment().subtract(18, 'months').startOf('month');
// Get current month
var month = date.month();
// Get monday of the first week of the month
var firstMonday = moment(date).weekday(0);
// Check if the first day of the month is not Monday
// and first monday of first week is in the desired month
if( date.weekday() != 0 && firstMonday.month() != month ){
    // Add 1 week if needed
    firstMonday.add(1, 'weeks');
}

上面的例子将周一视为一周的第一天。如果星期一不是一周的第一天(索引为0的那一天),您可以使用moment.weekdays()

获取正确的索引