【发布时间】:2019-06-03 15:42:04
【问题描述】:
背景:活动策划/管理软件工具
目标:复制前一年的活动 - 并为用户选择活动的开始和结束日期提供先机。
假设:这个新事件很可能是重复/逐年事件。因此,2018 年 10 月的事件将被复制到 2019 年 10 月。
示例: 被克隆的活动的开始日期为:2016 年 10 月 20 日星期四,结束日期为:2016 年 11 月 3 日星期四(这包括活动的设置和拆除日期)
预期结果:
- 日期范围内的天数保持不变。 (14 天)
- 保持星期几。 (星期四)
代码应返回新的开始日期: 2019 年 10 月 17 日星期四和结束日期:2019 年 10 月 31 日星期四
可选:另一个可接受的日期范围可能是: 2019 年 10 月 24 日星期四和 2019 年 11 月 7 日结束日期
可能的逻辑: 我认为预期的结果可以通过获取月份、该月的星期和该星期的日期来实现 - 并以此为基础构建新的事件日期,为新的一年。
注意事项: 如果可能的话,我想使用Moment.js 库
当前代码: 这是我们目前拥有的,但它没有返回预期的结果。似乎只是减去一天而不管年份差异。
const today = moment();
const thisYear = today.format('YYYY');
const old_start = moment('2018-10-08');
const old_end = moment('2018-08-12');
// if in same year, use current dates
if (thisYear === old_start.format('YYYY')) {
console.log({
start: new_start.format('YYYY-MM-DD'),
end: new_end.format('YYYY-MM-DD')
})
} else {
console.log({
start: new_start.year(thisYear)
.isoWeek(old_start.isoWeek())
.isoWeekday(old_start.isoWeekday())
.format('YYYY-MM-DD'),
end: new_end.year(thisYear)
.isoWeek(old_end.isoWeek())
.isoWeekday(old_end.isoWeekday())
.format('YYYY-MM-DD')
})
}
The resulting, incorrect dates:
如果我们在这里做错了什么,以及我们如何解决它,我们将不胜感激。谢谢!
【问题讨论】:
-
您可以直接对日期的数字部分进行数学运算。如果您将年份加 1,您会(根据需要)调整下一年的日期,然后您可以检查星期几以根据需要向前或向后移动范围。
-
我相信你的方法是有效的,但是你的代码有问题。
new_start和new_end来自哪里? -
@Pointy,明白了。因此,您建议只在开始日期和结束日期中添加一年 - 然后以某种方式将其向前或向后调整到一周中 最近的(可能)匹配的一天?
-
嗯,星期几的调整取决于您自己时间范围的语义。例如,一些会议在每年同一个月的某个特定时间举行,并且通常具有一致的模式,如“星期四和星期五”。您将如何自动找到下一年的日期取决于您对时间范围的了解。
.getDay()API 为您提供星期几(0 到 6,0 是星期日),因此您可以使用它通过.setDate()调整月份中的日期。 -
@Pointy,好吧 - 我知道每个日期之间的天数。那应该不是问题。所以 - 如果我在活动日期前的星期一加载,并在活动后的星期二(8 天)完成加载 - 我想在下一年保持该持续时间和星期几的结构。哪个 API 可以让我将日期范围的两边调整为一周的正确开始日期。 (如果天数保持固定 - 一周的结束日应该没问题)。希望我能和你一起跟踪......
标签: javascript date momentjs date-range