将moment js给出的日期范围除以周数
Divide the date range given by moment js by weeks
我想将给定的日期范围分成几个月。我想把这几个月按周分开。我想以 7 天的间隔获取从开始日期到月末的日期。例如:(如 15/12/2020、22/12/2020、29/12/2020 -newMonth- 05/01/2020)
这个解释很难理解。毕竟我想创建一个这样的json。
开始日期:15/11/2020 - 结束日期:20/01/2021
[
{
"dates": [
15, // Starting date(15/11/2020)
22, // 1 week later
29 // 1 week later
],
"firstDay": "15/11/2020"
},
{
"dates": [
6,
13,
20,
27
],
"firstDay": "06/12/2020"
},
{
"dates": [
3,
10,
17
],
"firstDay": "03/01/2021"
}
]
Moment.JS 有一个 API 用于向日期添加天数:add 函数。
为了构建最终对象,您将从开始日期开始,并为每个循环迭代添加 7 天,直到到达结束日期。像这样:
let currentDate = moment(startDate);
while(currentDate < endDate) { // Make sure endDate is also a moment object
// Add the current date - you will want to adapt this
dates.push(currentDate.clone()); // Since .add() will mutate the currentDate object, clone the object when adding it to the array so that it's not affected by the add()
// Prepare for the next iteration
currentDate.add({days: 7});
}
至于月份更改,请记住每次迭代的最后一个月(使用 month)并在最终数组中创建一个新对象,然后将日期添加到对象而不是前一个。
旁注:月份在 Javascript 中是零索引的,月日不是这种情况 (date)
您可以使用一些技巧来创建您想要的数组结构:
- 使用
while
循环,使 current
日期不断递增 7 天,与 end
日期进行比较。 current
日期应使用循环开头的 start
日期进行初始化。
- 要在您想要的结构中执行“按月分组”,您将需要使用一个对象(用作字典)。该对象将使用
month + year
组合作为键,这样如果您的日期范围跨越多年,您就不会将不同年份的月份合并到同一个条目中。
对于 while
循环的每次迭代,您从当前日期构造键,然后检查该键是否存在于您的字典中。如果没有,那么我们可以将这个对象推入你的字典:
{
dates: [currentDate],
firstDate: currentDate
}
如果它已经存在,那么您只需将日期推入子对象的 dates
数组。
最后,要将字典转换为所需的数组结构,使用 ES6 Object.values()
即可。请参阅下面的概念验证:
function generateRanges(startDate, endDate) {
let current = moment(startDate, 'DD/MM/YYYY');
const end = moment(endDate, 'DD/MM/YYYY');
// A dictionary to track unique month+year combinations
const daysByMonth = {};
while (current < end) {
// Construct key based on month+year
const key = `${current.month()}${current.year()}`;
const date = current.date();
// If key already exists, then we push into the `dates` array
if (key in daysByMonth) {
daysByMonth[key].dates.push(date);
}
// Otherwise we construct a brand new sub-object
else {
daysByMonth[key] = {
dates: [date],
// Since this is the first time we encounter the key,
// We can assume this is the earliest/first date of the month
firstDate: current.format('DD/MM/YYYY')
}
}
// At the end of the while loop, increment by a week, rinse and repeat
current.add(7, 'days');
}
// Once done, we only want the values in the dictionary
// We don't need to keep the unique month+year key
return Object.values(daysByMonth);
}
const range = generateRanges('15/11/2020', '20/01/2021');
console.log(range);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
处理日期或日期时间始终是使用毫秒的好习惯。它也是 space 高效的,一个长整数 = 4kb 而不是 32 字节的 Date() 对象。
在你的情况下,将我们的日期转换为毫秒非常简单,找到整数之间的周数,然后 运行 通过此迭代进行循环增量。
let from = new Date('2020/11/15').getTime();
let to = new Date('2021/01/20').getTime();
let week = 604800000;
let day = 86400000;
let allWeeks = [];
let current =0;
let weeks = (to-from)/day/7
for (i=0; i<weeks; i++){
allWeeks.push(new Date(from += week).toLocaleDateString())
}
console.log(JSON.stringify(allWeeks))
//["22/11/2020","29/11/2020","06/12/2020","13/12/2020","20/12/2020","27/12/2020","03/01/2021","10/01/2021","17/01/2021","24/01/2021"]
最后,您将拥有一个适用于 JSON 的列表,以构建您喜欢的任何逻辑。
我希望针对您的案例指出不同的方法!
我想将给定的日期范围分成几个月。我想把这几个月按周分开。我想以 7 天的间隔获取从开始日期到月末的日期。例如:(如 15/12/2020、22/12/2020、29/12/2020 -newMonth- 05/01/2020)
这个解释很难理解。毕竟我想创建一个这样的json。
开始日期:15/11/2020 - 结束日期:20/01/2021
[
{
"dates": [
15, // Starting date(15/11/2020)
22, // 1 week later
29 // 1 week later
],
"firstDay": "15/11/2020"
},
{
"dates": [
6,
13,
20,
27
],
"firstDay": "06/12/2020"
},
{
"dates": [
3,
10,
17
],
"firstDay": "03/01/2021"
}
]
Moment.JS 有一个 API 用于向日期添加天数:add 函数。
为了构建最终对象,您将从开始日期开始,并为每个循环迭代添加 7 天,直到到达结束日期。像这样:
let currentDate = moment(startDate);
while(currentDate < endDate) { // Make sure endDate is also a moment object
// Add the current date - you will want to adapt this
dates.push(currentDate.clone()); // Since .add() will mutate the currentDate object, clone the object when adding it to the array so that it's not affected by the add()
// Prepare for the next iteration
currentDate.add({days: 7});
}
至于月份更改,请记住每次迭代的最后一个月(使用 month)并在最终数组中创建一个新对象,然后将日期添加到对象而不是前一个。
旁注:月份在 Javascript 中是零索引的,月日不是这种情况 (date)
您可以使用一些技巧来创建您想要的数组结构:
- 使用
while
循环,使current
日期不断递增 7 天,与end
日期进行比较。current
日期应使用循环开头的start
日期进行初始化。 - 要在您想要的结构中执行“按月分组”,您将需要使用一个对象(用作字典)。该对象将使用
month + year
组合作为键,这样如果您的日期范围跨越多年,您就不会将不同年份的月份合并到同一个条目中。
对于 while
循环的每次迭代,您从当前日期构造键,然后检查该键是否存在于您的字典中。如果没有,那么我们可以将这个对象推入你的字典:
{
dates: [currentDate],
firstDate: currentDate
}
如果它已经存在,那么您只需将日期推入子对象的 dates
数组。
最后,要将字典转换为所需的数组结构,使用 ES6 Object.values()
即可。请参阅下面的概念验证:
function generateRanges(startDate, endDate) {
let current = moment(startDate, 'DD/MM/YYYY');
const end = moment(endDate, 'DD/MM/YYYY');
// A dictionary to track unique month+year combinations
const daysByMonth = {};
while (current < end) {
// Construct key based on month+year
const key = `${current.month()}${current.year()}`;
const date = current.date();
// If key already exists, then we push into the `dates` array
if (key in daysByMonth) {
daysByMonth[key].dates.push(date);
}
// Otherwise we construct a brand new sub-object
else {
daysByMonth[key] = {
dates: [date],
// Since this is the first time we encounter the key,
// We can assume this is the earliest/first date of the month
firstDate: current.format('DD/MM/YYYY')
}
}
// At the end of the while loop, increment by a week, rinse and repeat
current.add(7, 'days');
}
// Once done, we only want the values in the dictionary
// We don't need to keep the unique month+year key
return Object.values(daysByMonth);
}
const range = generateRanges('15/11/2020', '20/01/2021');
console.log(range);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
处理日期或日期时间始终是使用毫秒的好习惯。它也是 space 高效的,一个长整数 = 4kb 而不是 32 字节的 Date() 对象。
在你的情况下,将我们的日期转换为毫秒非常简单,找到整数之间的周数,然后 运行 通过此迭代进行循环增量。
let from = new Date('2020/11/15').getTime();
let to = new Date('2021/01/20').getTime();
let week = 604800000;
let day = 86400000;
let allWeeks = [];
let current =0;
let weeks = (to-from)/day/7
for (i=0; i<weeks; i++){
allWeeks.push(new Date(from += week).toLocaleDateString())
}
console.log(JSON.stringify(allWeeks))
//["22/11/2020","29/11/2020","06/12/2020","13/12/2020","20/12/2020","27/12/2020","03/01/2021","10/01/2021","17/01/2021","24/01/2021"]
最后,您将拥有一个适用于 JSON 的列表,以构建您喜欢的任何逻辑。
我希望针对您的案例指出不同的方法!