Moment js按星期和星期几获取一个月中的特定日期
Posted
技术标签:
【中文标题】Moment js按星期和星期几获取一个月中的特定日期【英文标题】:Moment js get specific day of a month by week and day of week 【发布时间】:2017-12-16 18:53:51 【问题描述】:如何使用moment js获取给定月份的第二个星期二或给定月份的第三个星期四。
我尝试寻找解决方案,但没有成功。我自己编写并在下面发布了答案,如果您有更好的解决方案,您可以回答您的实施。
【问题讨论】:
可能我没有完全理解您的要求,但请参阅here(和here)以获得类似问题的可能解决方案。 他们只在某一天工作。我的要求是任何一周中的任何一天。 在链接的答案中,星期几是“硬编码”的,但我认为从该答案开始很容易获得更通用的解决方案。无论如何,我已经发布了一个更新的答案,我试图获得任何一周中的任何一天。 【参考方案1】:这里是我在 cmets 中链接的答案的更新版本。我已经使用weekday
来使用支持区域设置的星期几,如果您总是希望星期天为 0,星期六为 6,您可以使用day
。
var getGivenDateOfMonth = function (startDate, dayOfWeek, weekNumber)
// Start of the month of the given startDate
var myMonth = moment(startDate).startOf('month');
// dayOfWeek of the first week of the month
var firstDayOfWeek = myMonth.clone().weekday(dayOfWeek);
// Check if first firstDayOfWeek is in the given month
if( firstDayOfWeek.month() != myMonth.month() )
weekNumber++;
// Return result
return firstDayOfWeek.add(weekNumber-1, 'weeks');
// Examples
var secondMondayOfJuly = getGivenDateOfMonth('2017-07-10', 1, 2);
console.log(secondMondayOfJuly.format());
var thirdFridayOfJuly = getGivenDateOfMonth('2017-07-10', 5, 3);
console.log(thirdFridayOfJuly.format());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
【讨论】:
【参考方案2】://get a preferred day of a month
var getGivenDateOfMonth = function (startDate, dayOfWeek, weekNumber)
var startOfMonth = moment(startDate).utc().startOf('month').startOf('isoweek');
var dayOne = moment((moment(startDate, "YYYY-MM-DD").format("YYYY-MM") + "-01"),"YYYY-MM-DD");
var studyDate;
if (dayOne.isoWeekday() === 1)
studyDate = moment(startDate).utc().startOf('month').startOf('isoweek').add(dayOfWeek - 1, 'days')
.add(weekNumber, 'w');
else if (dayOne.isoWeekday() <= dayOfWeek)
studyDate = moment(startDate).utc().startOf('month').startOf('isoweek').add(dayOfWeek - 1, 'days')
.add(weekNumber - 1, 'w');
else
studyDate = moment(startDate).utc().startOf('month').startOf('isoweek').add(dayOfWeek - 1, 'days')
.add(weekNumber, 'w');
if (studyDate.month() == startOfMonth.month())
studyDate = studyDate.subtract(1, 'w');
return studyDate;
;
startDate 是给定月份的日期。 dayOfWeek 是 js ISO 星期几,weeknumber 是你想要的周数(1,2,3,4)
【讨论】:
【参考方案3】:function nthDayOfMonth(month, year, day, weekNum)
var nearestDay = moment(month + " " + year,"M YYYY").day(day);
var nthDay = nearestDay.add(nearestDay.isSame(moment(month: month),"month") ? weekNum - 1 : weekNum ,"weeks");
return nthDay;
document.write(nthDayOfMonth(7,2017,3,3).format("L"));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
【讨论】:
【参考方案4】:获取本月第二个星期二的日期:
var date = new Date();
var month_week = 2; // 2nd Week
var week_day = 2; // Tuesday
var first_week = moment(date).startOf("month").day(week_day);
var result = first_week.add(7 * (month_week - 1), "days");
console.log(result);
<script src="https://momentjs.com/downloads/moment.min.js"></script>
【讨论】:
以上是关于Moment js按星期和星期几获取一个月中的特定日期的主要内容,如果未能解决你的问题,请参考以下文章