我正在写一些javascript并遇到了时刻库。我想利用这个时刻来获得18个月前的第一个星期一。我该怎么办?
我知道18个月前它是
moment().subtract(18, 'months');
但我怎么知道那个时间的第一个星期一。
提前致谢!
答案 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()