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

[
  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/

10-12 14:23
查看更多