javascript - 使用时刻舍入到下一个第一个或第三个星期一
问题描述
想知道是否有人可以提供帮助,我正在尝试使用 moment.js 来约会(比如今天),然后用它来返回下一个第一个或第三个星期一,以较早者为准。
因此,例如今天为 01/18,下一个(第 1 或第 3,在这种情况下,第 3 个星期一将是 1/20)。
或者如果今天是下一个 1/27(在这种情况下,第一个星期一是 2/03)。
解决方案
一种算法是:
- 如果日期不是星期一,请移至下星期一
- 如果当天是第 7 天或之前,则为第一个星期一
- 如果日期在 7 号之后和 14 号之前,则为第二个星期一,因此将第 3 个星期一加 7 天
- 如果日期在 21 日之后,则移至下个月的第一个星期一
没有库的实现是:
/* Get next 1st or 3rd Monday of month
** @param {Date} date : start date
** @returns {Date} date for 1st or 3rd Monday of month
*/
function getMonday(date) {
// Copy date so don't affect original
date = new Date(date);
// If not Monday, move to next
if (date.getDay() != 1) {
date.setDate(date.getDate() + 8 - (date.getDay() || 7))
}
let day = date.getDate();
// If after 1st Monday, move to 3rd
if (day > 7 && day < 14) {
date.setDate(date.getDate() + 7);
// If after 3rd Monday, move to 1st of next month
} else if (day > 21) {
date.setMonth(date.getMonth() + 1, 1);
date = getMonday(date);
}
return date;
}
// Test in March 2020
let d = new Date(2020,2,1);
let opts = {weekday:'short', day:'2-digit', month:'short'};
for (var i=0; i<31; i++) {
console.log(d.toLocaleString('en-gb', opts) + ' -> '
+ getMonday(new Date(d)).toLocaleString('en-gb', opts));
d.setDate(d.getDate() + 1);
}
下面是使用 moment.js 的实现。使用 . 很有诱惑力moment.endOf('week')
,但由于它是“区域设置感知的”,它可能会在星期六或星期日结束,具体取决于主机系统设置,因此逻辑最终与普通 js 解决方案相同,仅使用 moment.js 方法:
/* @param {Moment} m - moment object for start date
** @returns {Moment} moment object for required Monday
*/
function getMondayMoment(m) {
m = moment(m);
// If not Monday, move to next
if (m.day() != 1) {
m.add(8 - (m.day() || 7), 'days');
}
let day = m.date();
// If after 1st Monday, move to 3rd
if (day > 7 && day < 14) {
m.add(7, 'days');
// If after 3rd Monday, move to 1st of next month
} else if (day > 21) {
m.set({month: m.get('month') + 1, date: 1});
m = getMondayMoment(m);
}
return m;
}
// Test over March 2020
let m = moment('2020-03-01');
for (var i=0; i<31; i++) {
console.log(
m.format('ddd DD MMM') + ' -> ' +
getMondayMoment(m).format('ddd DD MMM')
);
m.add(1, 'day');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
推荐阅读
- python-3.x - 熊猫样式标签给出“ValueError:非唯一索引不支持样式”
- php - 如何将会话变量转换为 POST
- node.js - 即使 uid 不存在,Dgraph 查询也会返回数据
- slurm - SLURM:更改正在运行的阵列作业的最大同时运行任务数
- android - 房间 - 通过字符串查找对象的总和?
- java - 在java中使用鼠标在画布上绘制线条而不使用Swing
- javascript - 将 jQuery var 传递给进度条样式
- http - Arduino GET 方法链接
- python - 如何为 matplotlib 设置乳胶路径
- java - 使用 java 以编程方式在 keycloak 4.8.3 中创建用户