js 推断一组日期是不是是一连的

这是群里一朋侪问的题目,当时我说推断下 day 是不是相邻即可,厥后细想,发明完整不对。

<!– more –>

题目需求

给定5个雷同花样的日期,怎样推断是不是是一连5天呢?

我当时第一回响反映 getDay() 后排序,然后前后对照即可。。
然则细想,完整不对,比方本周一下周二,如许也会误判。

而且不单单议如许的题目,还要跨月,跨年,闰月等题目。
然后就有了下面的代码。

让时候戳抹平一切吧

为了不纠结这些题目,我想到了时候戳,这货就能够完整疏忽上述题目了,只需处置惩罚时候戳,末了比较即可。
然后我给了如下代码:

let days = [
  '2016-02-28',
  '2016-02-29', // 闰月
  '2016-03-01', // 跨月
  '2016-03-02',
  '2016-03-03',
]

// 先排序,然后转时候戳
let _days = days.sort().map((d, i) => {
  let dt = new Date(d)
  dt.setDate(dt.getDate() + 4 - i) // 处置惩罚为雷同日期

  return +dt
})

// 比较时候戳是不是一致
console.log(
  _days[0] == _days[1] &&
  _days[0] == _days[2] &&
  _days[0] == _days[3] &&
  _days[0] == _days[4]
)

ok 一切题目都处理掉了,跨年,跨月,闰月也都无所谓了。

通用函数封装

上述代码照样有点缺点的,由于时分秒没有处置惩罚,如果有时分秒,也要先抹去。

let days = [
  '2016-02-28 12:00:00',
  '2016-02-29 12:00:01', // 闰月
  '2016-03-01 12:00:02', // 跨月
  '2016-03-02 12:00:03',
  '2016-03-03 12:00:04',
  '2016-03-04 12:00:04',
]

console.log(continueDays(days))

function continueDays(arr_days) {
  // 先排序,然后转时候戳
  let days = arr_days.sort().map((d, i) => {
    let dt = new Date(d)
    dt.setDate(dt.getDate() + 4 - i) // 处置惩罚为雷同日期

    // 抹去 时 分 秒 毫秒
    dt.setHours(0)
    dt.setMinutes(0)
    dt.setSeconds(0)
    dt.setMilliseconds(0)

    return +dt
  })

  let ret = true

  days.forEach(d => {
    if (days[0] !== d) {
      ret = false
    }
  })

  return ret
}

这个函数只是改动了2个处所,抹去 时 分 秒 毫秒轮回比较,其他都一样。

小结

js 处置惩罚时候照样异常简朴的,比方写个日期插件,实在借助 Date 异常轻易完成,但完成你要相识 Date 的 api 才行。
固然要说简朴,照样 php 最简朴,那几乎逆天。

    原文作者:楼教主
    原文地址: https://segmentfault.com/a/1190000005925931
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞