首页 > 其他分享 >js只比较日期(月日)的大小,不比较年份

js只比较日期(月日)的大小,不比较年份

时间:2023-01-10 16:33:15浏览次数:33  
标签:选择 年份 const 月份 js 日份 等于 比较 selectDate

需求背景:

     要求验证选择的时间是否在可选的时间范围内(即应用的时间范围),但是可选的时间范围是只有月份和天数,不限制年份,所以选择的时间也只验证月日,不校验年份

解决方案:

 需要比较只有月份和日份的日期的大小。当前想到的只有将月份和日份分别拆分出来做比较,目前考虑可能有五种情形:

   当开始时间的月份和结束时间的月份相同(例如 1.5~1.25):
   1.选择的月份等于可选时间的月份时,那么必须选择的日份大于等于开始的日份,小于等于结束的日份,否则其他都是false
   2.选择的月份不等于应用的月份的都是false

   开始时间的月份小于结束时间的月份(只会小于,没有大于的场景)(例如 1.5~3.25):
   1.选择的月份等于应用的开始月份,那么必须选择的日份大于等于开始的日份(例如 1.10)
   2.选择的月份等于结束的月份,那么选择的日份必须小于等于结束的日份(例如 3.17)
   3.选择的月份大于开始的月份,小于结束的月份(例如 2.10)

上代码案例:

// 可选的时间范围
const minDate = "01-09";
const maxDate = "06-09";

// 当前选择的时间数据
const selectDate = [
"2023-02-11",
"2024-01-11",
"2022-05-11",
"2024-09-11"
];

if (isInRange(minDate, maxDate, selectDate)) {
    console.log('所选数据都在可选范围内');
    } else {
    console.log('存在数据不在可选范围内');
}


// 判断是否在可选时间范围内的方法封装
function isInRange(minDate, maxDate, selectDate) {
const beginTimeArr = minDate.split("-");
const endTimeArr = maxDate.split("-");
if (selectDate && selectDate.length > 0) {
    // 将选择的日期拆分成数组数据,方便拿取月份和时间
    const dateArr = selectDate.map((item) => item.split("-"));
    return dateArr.every((item) =>
    // 判断每一个选择的日期是否在最大最小的日期范围内
    compareMonthAndDay(item, beginTimeArr, endTimeArr)
    );
 } else return false;
}


// 判断每一个选择的日期是否在最大最小的日期范围内的方法封装
function compareMonthAndDay(item, beginTimeArr, endTimeArr) {
// 数组解构赋值,只拿取选择的时间月份和日份
const [, selectMonth, selectDay] = item
const [beginMonth, beginDay] = beginTimeArr
const [endMonth, endDay] = endTimeArr
// 应用日期范围在同一个月
if (beginMonth === endMonth) {
// 只有选择的月份等于应用的开始月份,选择的日大于等于开始日, 小于等于结束日为true,其他情况都是false
   return (
   selectMonth === beginMonth &&
   selectDay >= beginDay &&
   selectDay <= endDay
   );
} else {
  // 应用日期时间范围跨月
  // 选择的月等于开始月,那么选择的日大于等于开始日为true,其他为false
  if (selectMonth === beginMonth) return selectDay >= beginDay;
  // 选择的月等于结束月,那么选择的日小于等于结束日为true,其他为false
      if (selectMonth === endMonth) return selectDay <= endDay;
      // 其他情况: 当选择月大于开始月,小于结束月就为true
      return selectMonth > beginMonth && selectMonth < endMonth;
  }
}

 有更好的方案欢迎告知!(^-^)

标签:选择,年份,const,月份,js,日份,等于,比较,selectDate
From: https://www.cnblogs.com/applesky/p/17038380.html

相关文章

  • mac nodejs 切换版本
    https://www.cnblogs.com/Mr-Rshare/p/15922413.htmlhttps://www.jianshu.com/p/10a7547198f5......
  • node.js初识
    一.网址简介1. Node.js是什么?Node.js简介2.Node.js指南二.实践1.在windows下安装node.js安装包下载地址:https://nodejs.org/zh-cn/2......
  • 记录--JS-SDK页面打开提示realAuthUrl错误
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助测试环境好好地功能,上了生产,莫名其妙报错,开始以为是没有设置Js安全接口域名,结果让相应人员一查,已经设置了......
  • MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明
    ​第1部分 messagepack说明1.1messagepack的消息编码说明为什么messagepack比json序列化使用的字节流更少, 可通过图1-1、图1-2有个直观的感觉。  图1- 1与json的格式对......
  • 15个最好用的Node.JS后端框架
    15个最好用的Node.JS后端框架API和generators,全栈框架,大量的服务器库,它完全能够提供Web服务,无需使用Apache等外部软件。JavaScript引擎,很大一部分是用基本模块的JavaScrip......
  • js动态生成唯一id
    一.引入时间戳,生成可控长度的随机数随机数长度控制,定义一个长度变量(length),生成可控长度的随机数:Math.random().toString(36).substr(3,length)引入时间戳:Date.now()......
  • .Babylon格式的模型转化为glb模型,并使用ThreeJS加载显示
    问题描述:手里有几个.babylon格式的三维模型,但是没用过babylon,只对ThreeJS熟悉;但是最新的ThreeJS里发现已经没有BabylonLoader的加载器,能查到的暮志未晚提供的例子,应该是因......
  • 日常开发记录-js的Date对象中的toLocaleDateString()
    就是把Date对象的日期部分转换为字符串,并返回结果。代码示例:console.log(newDate())//2023-01-10T05:42:41.926Zconsole.log(newDate().toLocaleDateString())//......
  • Fabric.js 拖放元素进画布
    本文简介点赞+关注+收藏=学会了学习Fabric.js,我的建议是看文档不如看demo。本文实现的功能:将元素拖进到画布中并生成对应的图形或图片。效果如下图所示:思......
  • 【test、expr】条件控制(比较)
    【test】test一般有两种格式,即:testcondition或[condition]使用方括号时,要注意在条件两边加上空格。测试文件状态的条件表达式很多,但是最常用的可在下表中查到。-d......