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 最简单,那简直逆天。
js 判断一组日期是否是连续的的更多相关文章
- js返回一组日期中最近连续的天数
用js获取一组日期(并把当天算入)中连续的天数 刚开始可能想到单纯的比较日期大小判断连续, 而又有大小月,平闰年这些因素,还是时间戳来的安全; 首先得有一组日期,比如: var arr = [ '20 ...
- js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内
/** * 日期解析,字符串转日期 * @param dateString 可以为2017-02-16,2017/02/16,2017.02.16 * @returns {Date} 返回对应的日期对 ...
- Web报表工具JS开发之日期校验
在报表开发过程中,我们常常需要对查询界面进行日期校验.例如有两个参数:开始日期和结束日期,我们要校验的是:开始日期与结束日期不能为空,结束日期必须在开始日期之后以及结束日期必须在开始日期后的某个时间段 ...
- Js中处理日期加减天数
Js的处理日期还是很方便的. 一. 格式化日期为2017-07-04的格式 function formatTime(date) { var year = date.getFullYear(); var ...
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
腾讯云图片鉴黄集成到C# 官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...
- JS判断浏览器类型和详细区分IE各版本浏览器
今天用到JS判断浏览器类型,于是就系统整理了一下,便于后期使用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...
- js判断是否为空和typeof的用法
(1)typeof作用用于查看数据类型 (2)typeof用法typeof 返回值类型有number, string, boolean, function, undefined, objectPS:在 ...
- js 判断当前时间是否处于某个一个时间段内
js 判断当前时间(或者所选时间)是否在某一时间段 我们可以使用 jutils - JavaScript常用函数库的 isDuringDate 函数来实现 传入 beginDateStr (开始时间) ...
- js判断时间格式是否有效
js判断时间格式是否有效 1 短时间,形如 (13:04:06)function isTime(str){var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d ...
随机推荐
- js中同步与异步请求方式
异步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POST ...
- jquery最常用的几个方法。
jquery使用手册:http://www.eduyo.com/doc/jquery/cheatsheet.html addClass 样式: <style> .textRed { col ...
- maven 常见错误解决方法
1. 最重要的一点,使用国内镜像,比如 oschina.net 的镜像: 搜 jar 推荐:http://maven.outofmemory.cn/,速度极快. 2. 错误:Could not res ...
- ORA-01858: 在要求输入数字处找到非数字字符
数据库 date 字段问题 insert into WK_RE_LE (DACL_FILE_ID,DACL_GROUP_ID,BDCDYH,DACL_LENGTH,ISVALID,DACL ...
- 烂泥:mysql修改本地主机连接
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 在mysql数据库安装完毕后,为了能远程连接管理mysql数据库.我们一般是在mysql服务器上通过update命令来更新user表中的host记录的. ...
- Linux IPC System V 消息队列
模型 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> ftok() //获取key ...
- Linux rm 删除文件
rm 删除文件rm -f 强制删除-i 提示-r 删除目录的时候-v 可实话 rm -rfv 多目录 不提示 [root@wang whp]# touch .txt [root@wang whp]# ...
- 关于Leetcode上二叉树的算法总结
二叉树,结构很简单,只是比单链表复杂了那么一丢丢而已.我们先来看看它们结点上的差异: /* 单链表的结构 */ struct SingleList{ int element; struct Singl ...
- actionlib的身世之谜
不知道为什么会把这么严肃认真的一篇技术整理贴起这么一个故事会风格类似的名字,就这样吧:^)shenmegui 园子里有人整理了actionlib的初学者教程,我来整理下actionlib的细节描述吧. ...
- 淘宝美工一站式:淘宝ps高级美工技巧视频教程,HTML代码学习【教程下载
视频免费下载地址:http://www.fu83.cn/thread-243-1-1.html