如何解决使用moment.js识别第二个/第三个星期六
我正在尝试实现一种方法,该方法将在日期是否为假期的情况下返回。出于此用例的目的,假日天真的定义为所有星期日,以及第二个和第三个星期六。这是代码段,
export const isHoliday = (date: moment.Moment | Date) => {
if (date instanceof Date) {
date = moment(date);
}
const dayOfWeek = date.day();
if (dayOfWeek >= 1 && dayOfWeek < 6) {
// it is a weekday
return false;
}
if (dayOfWeek === 0) {
// it is a sunday
return true;
}
if (dayOfWeek === 6) {
return isSecondSaturday(date) || isThirdSaturday(date);
}
};
还有其他方法,
const isSecondSaturday = (date: moment.Moment) => {
return isNthSaturday(date,2);
};
const isThirdSaturday = (date: moment.Moment) => {
return isNthSaturday(date,3);
};
const isNthSaturday = (today: moment.Moment,n: number) => {
const thisMonth = today.clone().utc().startOf("month");
const firstSaturday = thisMonth.day(6); // <-- culprit?
const nthSaturday = firstSaturday.add(n - 1,"week");
return nthSaturday.date() === today.date();
};
在测试中,我发现某些月份没有正确识别出第二个和第三个星期六。我认为这可能是我所想不到的小事。
解决方法
您能否提供以下实施在哪个月份不起作用?我已将您的实施放入控制台,并检查了前四个月-一切正常。
function isHoliday(date) {
const dayOfWeek = date.day();
if (date instanceof Date) {
date = moment(date);
}
if (dayOfWeek >= 1 && dayOfWeek < 6) {
// it is a weekday
return false;
}
if (dayOfWeek === 0) {
// it is a sunday
return true;
}
if (dayOfWeek === 6) {
return isSecondSaturday(date) || isThirdSaturday(date);
}
};
function isSecondSaturday(date) {
return isNthSaturday(date,2);
};
function isThirdSaturday(date) {
return isNthSaturday(date,3);
};
function isNthSaturday(today,n){
const thisMonth = today.clone().utc().startOf("month");
const firstSaturday = thisMonth.day(6); // <-- culprit?
const nthSaturday = firstSaturday.add(n - 1,"week");
return nthSaturday.date() === today.date();
};
function checkHolidaysInMonth(monthIndex) {
var thisYear = moment().utc().startOf("year");
thisYear.add(monthIndex,'months');
for(var i = 0; i < 31; i++) {
if(isHoliday(thisYear) === true) {
console.log("Is 2nd or 3rd Sat or Sun: " + thisYear.format())
}
thisYear.add(1,'days');
}
}
checkHolidaysInMonth(3);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script>
,
好的,我已经找到了解决方案。我在代码中一直在使用另一种方法来查找最后的工作日期。这涉及一些日期减去。这本应该与该方法隔离,但是由于momentjs更改了原始时刻,因此只要调用该函数,就会产生副作用。
因此,如果您要操纵参数,请在执行操作之前在其上使用clone()
方法(see docs)。
例如moment().clone()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。