我有一个具有以下值的数组(示例):
[
1491408000000,
1491494400000,
1491753600000,
1493222400000,
1493308800000,
1493568000000
]
索引是日期时间。日期时间将始终为日期的12:00:00。
在此示例中,前三个日期是连续的跨周末(周末是假日,因此算作休假),然后另一组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;
});
最佳答案
这需要功能的帮助,以测试两个日期是否在同一周。以下内容遍历了数组中提供的一组时间值,并将第一个值放入数组中的数组中。对于每个后续值,它将测试它是否与外部数组中每个数组中的第一个值在同一周内。
如果它与任何现有数组中的第一个值在同一周,则将其推入该数组。否则,将其放入新数组并推入外部数组。
可能有一种更巧妙的方法来实现该算法,但我将其留给其他人使用。
由于时区差异,它们会根据表示源时区中午的原始时间值被调整为主机时区。
// Given 2 dates, return true if they are in the same week (Mon to Sun).
// Otherwise, return false
function sameWeek(a, b){
var e = new Date(+a);
// Week starts at 00:00:00.000 on Monday on or before date
var s = new Date(e.setDate(e.getDate() - ((e.getDay()||7) -1)));
s.setHours(0,0,0,0);
// Week ends at 23:59:59.999 the following Sunday
e.setDate(e.getDate() + 6);
e.setHours(23,59,59,999);
// Test b and return value
return b >= s && b <= e;
}
// Given time value for UTC-0400, adjust to same date and time
// in local time zone and return a date
function adjust(n) {
var d = new Date(n);
d.setMinutes(d.getMinutes() - 240 + d.getTimezoneOffset());
return d;
}
var result = [1491408000000,1491494400000,1491753600000,1493222400000,1493308800000,1493568000000
].reduce(function(acc, n) {
var d = adjust(n);
var used;
if (acc.length != 0) {
used = acc.some(function(arr) {
if (sameWeek(adjust(arr[0]), d)) {
arr.push(n);
return true;
}
});
}
if (!used || acc.length == 0) {
acc.push([n]);
}
return acc;
},[]);
// Result array
console.log(result);
// Printed as date strings adjusted to same host local time
result.forEach(arr => {
arr.forEach(n => console.log(adjust(n).toString()))
console.log('\n');
});
关于javascript - Javascript在数组中跨周和跨月获取顺序日期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42686797/