欢迎来到代码驿站!

JavaScript代码

当前位置:首页 > 网页前端 > JavaScript代码

js 判断一组日期是否是连续的简单实例

时间:2021-06-28 08:27:30|栏目:JavaScript代码|点击:

这是群里一朋友问的问题,当时我说判断下 day 是否相邻即可,后来细想,发现完全不对。

问题需求

给定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 最简单,那简直逆天。

上一篇:JS异步函数队列功能实例分析

栏    目:JavaScript代码

下一篇:一款不错的键盘密码输入js程序

本文标题:js 判断一组日期是否是连续的简单实例

本文地址:http://www.codeinn.net/misctech/149414.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有