资讯专栏INFORMATION COLUMN

js 判断一组日期是否是连续的

MartinHan / 3337人阅读

摘要:问题需求给定个相同格式的日期,怎么判断是否是连续天呢我当时第一反应后排序,然后前后对比即可。。而且不仅仅这样的问题,还要跨月,跨年,闰月等问题。

这是群里一朋友问的问题,当时我说判断下 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 最简单,那简直逆天。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79977.html

相关文章

  • task0002(一)- JavaScript数据类型及语言基础

    摘要:不过让流行起来的原因应该是是目前所有主流浏览器上唯一支持的脚本语言。经过测试,数字字符串布尔日期可以直接赋值,修改不会产生影响。再考虑对象类型为或者的情况。对于结果声明其类型。判断对象的类型是还是,结果类型更改。 转载自我的个人博客 欢迎大家批评指正 1. 第一个页面交互 这里最需要学习的老师的代码中,每一部分功能都由函数控制,没有创建一个全部变量。且最后有一个函数来控制执行代码...

    elarity 评论0 收藏0
  • egUtils—JavaScript工具类库

    摘要:现在市面上的不少,上一搜一大堆。当然这段时间也为了学习,所以边学边写了这个类库。一是为了练手,二是为了以后能提高开发的效率,毕竟自己写的自己熟,以后也会不断更新。 现在市面上js的utils不少,npm上一搜一大堆。当然这段时间也为了学习ts,所以边学边写了这个类库。一是为了练手ts,二是为了以后能提高开发的效率,毕竟自己写的自己熟,以后也会不断更新。github地址:https://...

    Harriet666 评论0 收藏0
  • 精读《Tableau 入门》

    摘要:可以看到,遥遥领先的城市有三个,加州是销售之王。将再拖拽到,并右键将其粒度改为月。从上图可以看到,指定了个分类,最右上角加州就是最突出的一组,整个聚类只有它一个元素,而画面偏左下角的也是一类,这些是业绩较差的一组数据。 1. 引言 引用著名瑞典统计学家 Hans Rosling 的一句话:想法来源于数字、信息,再到理解。 分析数据的最好方式是可视化,因为可视化承载的信息密度更高,甚至可...

    svtter 评论0 收藏0
  • 精读《Tableau 探索式模型》

    摘要:比如我们对调与会怎样我们得到了三个不同类目近个月的趋势,之所以是折线图,因为图表的维度轴列是连续的。在正式介绍标记区域前,先理解一下为何会发生这种转变表格类组件是双维度组件,折线图是单维度组件。 1. 引言 Tableau 探索式分析功能非常强大,各种功能组合似乎有着无限的可能性。 今天笔者会分析这种探索式模型解题思路,一起看看这种探索式分析功能是如何做到的。 2. 精读 要掌握探索式...

    curried 评论0 收藏0

发表评论

0条评论

MartinHan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<