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


    文章同步自个人博客:http://www.52cik.com/2016/07/10/consecutive-dates.html

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

  • 相关阅读:
    【NOIP2012模拟10.6】填充棋盘
    【NOIP2012模拟10.6】购买
    ASP.NET网站权限设计实现(二)——角色权限绑定
    ASP.NET网站权限设计实现(一)——使用PowerDesigner进行数据库设计
    获取post发送过来的xml包
    js正则表达式30分钟入门教程
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    js 取整
    [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》
    c# 多线程排队队列实现的源码
  • 原文地址:https://www.cnblogs.com/52cik/p/consecutive-dates.html
Copyright © 2020-2023  润新知