Javascript获取数组中跨周和跨月的连续日期

Javascript获取数组中跨周和跨月的连续日期,javascript,arrays,date,Javascript,Arrays,Date,我有一个具有以下值的数组(示例): 其中索引是日期时间。日期时间始终为日期的12:00:00 在本例中,前3个日期是连续的跨周末(周末是假日,因此算作假期),然后另一组3个日期跨周末和月份 现在,我要做的是查找连续日期(跨周和跨月),并将它们放入一个数组中,如下所示: [ 1491408000000, 1491494400000, 1491753600000 ], [ 1493222400000, 1493308800000, 1493568000000 ] 我已经尝试

我有一个具有以下值的数组(示例):

其中索引是日期时间。日期时间始终为日期的12:00:00

在本例中,前3个日期是连续的跨周末(周末是假日,因此算作假期),然后另一组3个日期跨周末和月份

现在,我要做的是查找连续日期(跨周和跨月),并将它们放入一个数组中,如下所示:

[
  1491408000000,
  1491494400000,
  1491753600000
],
[
  1493222400000,
  1493308800000,
  1493568000000
]
我已经尝试了下面的代码来获取连续的日期,但这不能跨周和跨月,如何修改代码以获得上述结果?任何帮助都将不胜感激

var timeValue = new Date(dateReview).getTime(); 
valueCon.push(timeValue);                                           

var k = 0;   
sortedValue[k] = [];

valueCon.sort( function ( a, b ){
    return +a > +b ? 1 : +a == +b ? 0: -1;
})
.forEach( function( v , i ){
    var a = v,b = valueCon[i+1]||0;

    sortedValue[k].push( +a );

    if ( (+b - +a) > 86400000) {                                
        sortedValue[++k] = []
    }
    return 1;
});                     

sortedValue.sort( function ( a,b ){
    return a.length > b.length ? -1: 1;
});

操纵时间戳是一种痛苦。JavaScript有一个内置的
Date
类型,我建议您使用它
Date#getUTCDay
以整数形式返回一周中的某一天(作为参考,
4
是星期五,或周末的前一天),而
Date#setUTCDate
Date#getUTCDate
一起允许您以天为增量调整日期(并使其上溢/下溢到下一个月)。因此,要确定时间戳
b
是否在
a
之后“按顺序”(周末除外)跟随,可以使用:

function sequential (a, b) {
  a = new Date(a)
  return a.setUTCDate(a.getUTCDate() + (a.getUTCDay() === 4 ? 3 : 1)) === b
}
分组只是之后的练习;上面的代码包含此解决方案背后的所有实际逻辑


示例代码段
var日期=[
1491408000000,
1491494400000,
1491753600000,
1493222400000,
1493308800000,
1493568000000
]
功能顺序(a,b){
a=新日期(a)
返回a.setUTCDate(a.getUTCDate()+(a.getUTCDay()==4?3:1))==b
}
函数组顺序(日期){
if(dates.length<2)返回[dates.slice()]
排序(函数(a,b){返回a-b})
var结果=[],组
对于(变量i=0;ilog(groupSequential(dates))
操作时间戳是一件痛苦的事。JavaScript有一个内置的
Date
类型,我建议您使用它
Date#getUTCDay
以整数形式返回一周中的某一天(作为参考,
4
是星期五,或周末的前一天),而
Date#setUTCDate
Date#getUTCDate
一起允许您以天为增量调整日期(并使其上溢/下溢到下一个月)。因此,要确定时间戳
b
是否在
a
之后“按顺序”(周末除外)跟随,可以使用:

function sequential (a, b) {
  a = new Date(a)
  return a.setUTCDate(a.getUTCDate() + (a.getUTCDay() === 4 ? 3 : 1)) === b
}
分组只是之后的练习;上面的代码包含此解决方案背后的所有实际逻辑


示例代码段
var日期=[
1491408000000,
1491494400000,
1491753600000,
1493222400000,
1493308800000,
1493568000000
]
功能顺序(a,b){
a=新日期(a)
返回a.setUTCDate(a.getUTCDate()+(a.getUTCDay()==4?3:1))==b
}
函数组顺序(日期){
if(dates.length<2)返回[dates.slice()]
排序(函数(a,b){返回a-b})
var结果=[],组
对于(变量i=0;ilog(groupSequential(dates))
这需要函数的帮助来测试两个日期是否在同一周内。下面介绍数组中提供的一组时间值,并将第一个值放入数组中的数组中。对于每个后续值,它将测试它是否与外部数组中每个数组中的第一个值在同一周内

如果它与任何现有数组中的第一个值在同一周内,它将被推入该数组。否则,它将被放入一个新的数组并被推入外部数组

也许有一种更简洁的方法来实现该算法,但我将把它留给其他人

由于时区不同,它们会根据源时区中表示中午的原始时间值调整为主机时区

//给定两个日期,如果它们在同一周(周一到周日),则返回true。
//否则,返回false
功能sameWeek(a、b){
var e=新日期(+a);
//本周开始于日期当天或之前的周一00:00:00.000
var s=新日期(例如setDate(e.getDate()-((e.getDay()| 7)-1));
s、 设定小时数(0,0,0,0);
//本周在下一个星期日23:59:59.999结束
e、 设置日期(如getDate()+6);
e、 设定时间(23,59,59999);;
//测试b和返回值
返回b>=s&&b{
arr.forEach(n=>console.log(adjust(n).toString())
console.log('\n');

});
这需要函数的帮助来测试两个日期是否在同一周内。下面介绍数组中提供的一组时间值,并将第一个值放入数组中的一个数组中。对于每个后续值,它将测试它是否与外部数组中每个数组中的第一个值在同一周内

如果它与任何现有数组中的第一个值在同一周内,它将被推入该数组。否则,它将被放入新数组并推入外部数组

也许有一种更简洁的方法来实现该算法,但我将把它留给其他人

由于时区不同,它们会根据源时区中表示中午的原始时间值调整为主机时区

//给定两个日期,如果它们在同一周(周一到周日),则返回true。
//否则,返回false
功能sameWeek(a、b){
var e=新日期(+a);
//本周开始于日期当天或之前的周一00:00:00.000
var s=新日期(例如setDate(e.getDate()-((e.getDay()| 7)-1));
s、 设定小时数(0,0,0,0);
//本周在下一个星期日23:59:59.999结束
e、 设置日期(如getDate()+6);
e、 设定时间(23,59,59999);;
//测试b和返回值
返回b>=s&&b{
arr.forEach(n=>console.log(adjust(n).toString())
console.log('\n');
});
如果为1