uniapp uni-calender日历组件 查近期还款历史

近期用uniapp开发小程序,有个查询还款历史的需求,度娘了下,始终没有很理想的方法,自己总结归纳写了一个:
思路:
1,要查询几个月的,就在当前日期上,减掉几个月。大方向是这样。
2,细节:相减之后的那年要判断是闰年,平年,Math.min() 方法取值,以防是当月的最后一天,每个月天数不一样,定义上闰年和平年的对象数组。
3,细节:目前需求习惯用 yyyy-mm-dd的形式表达,最好return出的是new Date() 格式,方便转换成任何需要的格式。
不多说,上代码,开干!!!
1,现在工具类untils.js中定义 minusMonths

// 往前推几个月 查询还款, 默认查询 3个月还款 
// let uu = new Date(2023,4,31); 
//  console.log(uu.toLocaleDateString(), 'uu')// 2023/5/31
//  let dd = minusMonths(uu, 8) ; //2023/6/2 往前推8个月 
//  console.log(dd.toLocaleDateString(), 'dddd') // 2022/10/2
// dd.toLocaleDateString().replaceAll("/", "-")  // 2022-10-2
export function minusMonths(startDate, months) {
    var counts = {
        normal: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
        leap: [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    };
    console.log(startDate.getMonth() + 1 - months)
    var year;
    if (startDate.getMonth() + 1 - months > 0) {
        year = startDate.getFullYear()
    } else {
        if (Math.floor(months / 12) == 0) {
            year = startDate.getFullYear() - 1
        } else {
            year = startDate.getFullYear() - Math.floor(months / 12)
        }
    }
    // var year = startDate.getMonth()+1 - months > 0 ? startDate.getFullYear() : startDate.getFullYear() -  Math.floor(months / 12)
    console.log(year, 'year')
    var yearType = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ? 'leap' : 'normal';
    var month;
    if (startDate.getMonth() + 1 - months > 0) {
        month = startDate.getMonth() - months
    } else {
        if (Math.floor(months / 12) == 0) {
            month = startDate.getMonth() - months + 12
        } else {
            month = startDate.getMonth() - months + 12 * Math.floor(months / 12)
        }
    }
    // var month = startDate.getMonth()+1 - months > 0 ? startDate.getMonth() - months : startDate.getMonth() - months  + 12 * Math.floor(months / 12);
    console.log(month, 'month')
    var date = Math.min(startDate.getDate(), counts[yearType][month]);
    return new Date(year, month, date);
}

具体实现:

  1. .getMonth() 得到的月数和实际月数不一样,打印出来是[0, 1, 2, 3, 4, 5, 6, 7, 8,9,10, 11] ,实际的越是要+1, 判断是否需要跨年,比如当前8月,查询近3个月的历史,8-3,不用跨年,直接8-3 ok;如果需要跨年,跨1年和跨N(N > 1)年又不一样;如果跨1年,Math.floor(months / 12) == 0 year = 当年-1,向上取值为1, 如果跨N年, year = 当年- months / 12向下取值。比如,当前是2023-6-5,查询近39个月的还款历史,正确日期为,2020-3-5 ,年数应该是 2023 - 3 (39 / 12 向下取值), 如下:
if (startDate.getMonth() + 1 - months > 0) {
       year = startDate.getFullYear()
   } else {
       if (Math.floor(months / 12) == 0) {
           year = startDate.getFullYear() - 1
       } else {
           year = startDate.getFullYear() - Math.floor(months / 12)
       }
   }
  1. 计算月数,同样道理,跨度为1年,月数要加上12,跨度为N(N > 1)年,要加 12 * months / 12向下取值。
if (startDate.getMonth() + 1 - months > 0) {
        month = startDate.getMonth() - months
    } else {
        if (Math.floor(months / 12) == 0) {
            month = startDate.getMonth() - months + 12
        } else {
            month = startDate.getMonth() - months + 12 * Math.floor(months / 12)
        }
    }
  1. 判断闰年、 平年
var yearType = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ? 'leap' : 'normal';
  1. 哪一天,直接Math.min() 取最小
var date = Math.min(startDate.getDate(), counts[yearType][month]);
    return new Date(year, month, date);
  1. 在 vue 文件中引用
    html
<uni-calendar ref="calendar" class="uni-calendar--hook" :clear-date="true"
                    :insert="info.insert" :range="info.range"
                    @confirm="confirm" @close="close" />

js部分 注意要用HBuilderX引入uni-calender 插件, 怎么引入插件,自行百度,不多说

import { minusMonths } from "@/utils/utils.js"
let d = new Date()
let beforeDate = minusMonths(d, 3) // 默认查询近3个月历史
let beforeDateStr = beforeDate.toLocaleDateString() // 2023/6/9
let beforeDateStr1 =  beforeDate.toLocaleDateString().replaceAll("/", "-") // 2023-6-9

methods中有confirm 函数

confirm(e) {
               console.log(e, 'confirm');
               // 选择日期 必须从前往后
               if(e.range.before == "" || e.range.after == "") {
                   this.dateText = `${beforeDateStr}` + '~' + `${curDateStr}`
                   this.begDate = beforeDateStr;
                   this.endDate = curDateStr;
               } else {
                   let before = new Date(e.range.before.replace(/-/g, '/'))
                   let after = new Date(e.range.after.replace(/-/g, '/'))
                   //判断选择的时间先后
                   if (after > before) {
                       this.begDate = e.range.before;
                       this.endDate = e.range.after;
                   } else {
                       this.begDate = e.range.after;
                       this.endDate = e.range.before;
                   }
                   this.dateText = this.begDate + '~' + this.endDate;
               }
               
               const params = {
                   openId: uni.getStorageSync('openId'),
                   pageNum: 1,
                   pageSize: 20,
                   begDate: this.begDate.replace(/-/g, ''),
                   endDate: this.endDate.replace(/-/g, ''),
                   duebillNum: this.planItem.duebillNum,
               }
               this.$api.repayHistory(params).then(res => {
                   if (res.data.code === 200) {
                       this.list = res.data.data || [];
                       this.status = res.data.data.length < this.pageSize ? 'nomore' : 'loadmore';
                       this.pageNum++;
                   }
               })
               this.$forceUpdate();

               this.show = false;

           },

效果图 1 默认查询近3个月


image.png

效果图2 点击日期,默认显示当前时间


image.png

效果图3 选个时间范围,注意!!!!我先选择的后面日期,又点的前面时间,所以要判断日期先后顺序,见上面代码中有判断!


image.png

效果图4 点确定,效果如图


image.png

完美结束!
码字不易,请注明链接出处!请多多点赞!//www.greatytc.com/p/131cde96ed29

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容