下面小编就为大家带来一篇 js 判断一组日期是否是连续的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这是群里一朋友问的问题,当时我说判断下 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 判断一组日期是否是连续的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 phperz。
来源: http://www.phperz.com/article/17/0306/264354.html