JavaScript日期相关计算

article/2025/9/22 20:29:27

一、计算距离今天n天后或n天前的日期

首先定义两个公共的方法:月份日期数字转换;格式化日期形式(默认:年-月-日)

// 数字转换
changeNum (num) {if (num >= 10) {return num} else {return '0' + num}
},
// 格式化日期
formatDate (date) {var year = date.getFullYear()var month = this.changeNum(date.getMonth() + 1)var day = this.changeNum(date.getDate())return `${year}-${month}-${day}`
},

接下来就可以定义计算日期的方法了

/* data */
today: '', // 今天的日期
n: 1, // n天
expirationDays: null, // 距离今天n天后或n天前的日期
m: '', // 某个日期距离今天还有m天/* methods*/
// 计算距离今天n天后或n天前的日期(如:到期日)
computeExpirationDays () {var nowDate = new Date()this.today = this.formatDate(nowDate)var beginTime = nowDate.getTime()var endTime = beginTime + this.n * 24 * 60 * 60 * 1000nowDate.setTime(endTime)this.expirationDays = this.formatDate(nowDate)
},

计算距离今天n天后或n天前的日期另一种写法:

// 某日期向前/向后num天
jumpNumDay(date, num, linkStr = '-') {date = new Date(date.getTime() + (num * 24 * 60 * 60 * 1000))return date.getFullYear() + linkStr + this.changeNum(date.getMonth() + 1) + linkStr + this.changeNum(date.getDate())
},

二、计算某个日期距离今天的天数

// 计算某个日期距离今天的天数(如:还有几天到期)
computeRemainingDays () {var nowDate = new Date()var nowTime = Date.parse(nowDate)var endDate = this.expirationDays + ' 23:59:59'var endTime = Date.parse(endDate)var ms = endTime - nowTimethis.m = Math.floor(ms / (24 * 60 * 60 * 1000))
},

在这里插入图片描述
在这里插入图片描述

三、日期快捷选项(今日、昨日、本周、上周、本月、上月、今年、去年)

选择日期快捷选项:
在这里插入图片描述
不用快捷选项,使用日期选择器:
在这里插入图片描述
日期快捷选项禁用:
在这里插入图片描述

html代码

<v-card class="cardItem"><v-card-title class="subTitle">日期快捷选项</v-card-title><v-card-text><div class="rowAc"><divv-for="(item, index) in dateQuickSelection":key="index"class="rowAc dateQuickItem":class="{ active: chooseIndex === index, disabled: !dateQuickSwitch }"@click="chooseDateQuick(index)">{{ item.name }}</div><el-date-pickerv-model="dateRange"type="daterange"value-format="yyyy-MM-dd"end-placeholder="结束日期"start-placeholder="开始日期":clearable="false"range-separator="-"class="dataRangePicker"@change="chooseDateRange"></el-date-picker><el-switchv-model="dateQuickSwitch"active-text="日期快捷选项是否可用"style="margin-left: 16px;"></el-switch></div></v-card-text>
</v-card>

data中定义的变量:

dateQuickSelection: [ // 日期快捷选择列表{ code: "1", name: "今日" },{ code: "2", name: "昨日" },{ code: "3", name: "本周" },{ code: "4", name: "上周" },{ code: "5", name: "本月" },{ code: "6", name: "上月" },{ code: "7", name: "今年" },{ code: "8", name: "去年" },
],
chooseIndex: 0, // 日期快捷选择项索引
dateRange: [], // 自定义列表 - 日期范围
dateQuickSwitch: true, // 日期快捷选项是否可用

mounted调用方法:

mounted () {this.chooseDateQuick(0)
},

methods中定义的方法:

// 日期快捷选择事件
chooseDateQuick(index) {this.chooseIndex = indexvar tempCode = this.dateQuickSelection.find(ele => this.chooseIndex === Number(ele.code) - 1).codevar tempDate = new Date()var year = tempDate.getFullYear()var month = tempDate.getMonth()var day = tempDate.getDate()var week = tempDate.getDay()this.dateRange = []if (tempCode === '1') { // 今日this.dateRange.push(this.formatDate(tempDate), this.formatDate(tempDate))} else if (tempCode === '2') { // 昨日this.dateRange.push(this.jumpNumDay(tempDate, -1, '-'), this.jumpNumDay(tempDate, -1, '-'))} else if (tempCode === '3') { // 本周this.dateRange.push(this.formatDate(new Date(year, month, day - week + 1)), this.formatDate(tempDate))} else if (tempCode === '4') { // 上周this.dateRange.push(this.formatDate(new Date(year, month, day - week - 6)), this.formatDate(new Date(year, month, day - week)))} else if (tempCode === '5') { // 本月this.dateRange.push(this.formatDate(new Date(year, month, 1)), this.formatDate(tempDate))} else if (tempCode === '6') { // 上月this.dateRange.push(this.formatDate(new Date(year, month - 1, 1)), this.formatDate(new Date(year, month, 0)))} else if (tempCode === '7') { // 今年this.dateRange.push(this.formatDate(new Date(year, 0, 1)), this.formatDate(tempDate))} else if (tempCode === '8') { // 去年this.dateRange.push(this.formatDate(new Date(year - 1, 0, 1)), this.formatDate(new Date(year - 1, 11, 31)))}
},
// 日期范围选择器事件
chooseDateRange() {this.chooseIndex = null
},

css代码:

<style lang="scss" scoped>
.cardItem {margin-top: 10px;
}
.subTitle {color: #1B58F4;font-size: 16px;
}
.rowAc {display: flex;justify-content: flex-start;align-items: center;
}
.dateQuickItem {padding: 1px 8px;margin-right: 16px;color: #3C4353;font-size: 14px;line-height: 22px;font-weight: 400;border: 1px solid #DCDEE0;border-radius: 16px;background: #FFFFFF;cursor: pointer;box-sizing: border-box;
}
.dateQuickItem:hover, .dateQuickItem.active {color: #1B58F4;border: 1px solid #1B58F4;
}
.dateQuickItem.disabled {color: #C8C9CC;border: 1px solid #DCDEE0;background: #F7F8F9;cursor: not-allowed; // 禁止鼠标事件
}
.dataRangePicker {width: 240px !important;height: 32px !important;
}
</style>
<style lang="scss">
.dataRangePicker.el-date-editor .el-range-separator {line-height: 24px;
}
.dataRangePicker.el-date-editor .el-range__icon {margin-left: 0px;line-height: 24px;
}
.dataRangePicker.el-date-editor .el-range-input {width: 95px;
}
</style>

四、获取日期时间的方法

在这里插入图片描述
定义两个公共方法:格式化日期时间、格式化为周几

// 格式化日期时间:yyyy-MM-dd hh:mm:ssformatDateTime(date) {var year = date.getFullYear()var month = this.changeNum(date.getMonth() + 1)var day = this.changeNum(date.getDate())var hour = date.getHours()var minute = date.getMinutes()var second = date.getSeconds()hour = hour.toString().padStart(2, '0')minute = minute.toString().padStart(2, '0')second = second.toString().padStart(2, '0')return `${year}-${month}-${day} ${hour}:${minute}:${second}`
},
// 格式化周几
formatWeek(date) {var thisDay =  new Date(date).getDay()var weekDay = ['周日','周一','周二', '周三', '周四', '周五', '周六']  // 注意getDay()的结果区间为0至6,0表示周日return weekDay[thisDay]
},

获取日期时间:

<v-card class="cardItem"><v-card-title class="subTitle">获取日期时间的方法</v-card-title><v-card-text><div class="showChangeItem">获取年:{{new Date().getFullYear()}}</div><div class="showChangeItem">获取月:{{new Date().getMonth() + 1}}</div><div class="showChangeItem">获取日:{{new Date().getDate()}}</div><div class="showChangeItem">获取周几:{{new Date().getDay()}}</div><div class="showChangeItem">获取小时:{{new Date().getHours()}}</div><div class="showChangeItem">获取分:{{new Date().getMinutes()}}</div><div class="showChangeItem">获取秒:{{new Date().getSeconds()}}</div><div class="showChangeItem">获取毫秒:{{new Date().getMilliseconds()}}</div><div class="showChangeItem">获取从零开始的毫秒数:{{new Date().getTime()}}</div><div class="showChangeItem">格式化日期:{{this.formatDate(new Date())}}</div><div class="showChangeItem">格式化日期时间:{{this.formatDateTime(new Date())}}</div><div class="showChangeItem">格式化为周几:{{this.formatWeek(new Date())}}</div></v-card-text>
</v-card>
.showChangeItem {width: 350px;padding: 5px 12px;border-radius: 4px;background: #E8F3FF;
}
.showChangeItem + .showChangeItem {margin-top: 8px;
}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/KuYUi77r.shtml

相关文章

JS比较日期

这里&#xff0c;date1和date2看上去是一样的&#xff0c;但是运行 date1 date2 返回的却是false。这是因为date1、date2都是对象&#xff0c;类型为引用类型&#xff0c;所以如果需要比较他们&#xff0c;需要去比较他们的字面量值&#xff0c;而不是单纯的用 来比较。 var…

C语言:数组和for循环

数组&#xff1a; 分为&#xff1a;1 数组&#xff0c;2 数组的数组&#xff1b; 数组的数组&#xff1a; 数组符号&#xff1a;[ ] 和数组是没有关系的。 *(pi) p[i]; p[i]可以写成i[p]; 下面是我去年写的&#xff0c;这个笔记是梳理整合 所谓数组为2的有3个就是把内存好比为…

es6数组循环

先说说es5的循环&#xff0c;一下几种循环的前五种接收的参数是一样的&#xff0c;都是两个参数&#xff1a; 第一个参数&#xff1a;循环里面执行的回调函数&#xff0c;循环调用执行的语句 第二个参数&#xff1a;this的指向 循环中回调函数的参数有三个&#xff1a; 第一个参…

数组实现循环队列

循环队列 在实际使用队列时&#xff0c;为了使队列空间能重复使用&#xff0c;往往对队列的使用方法稍加改进&#xff1a;无论插入或删除&#xff0c;一旦rear指针增1或front指针增1 时超出了所分配的队列空间&#xff0c;就让它指向这片连续空间的起始位置。可以解决假溢出问题…

竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解

文章目录 队列的模拟实现队列是什么实现过程实现原理具体代码实现 循环数组循环数组是什么&#xff1f;循环数组如何实现队列&#xff1f;实现原理 总结 队列的模拟实现 队列是什么 队列是一种数据结构&#xff0c;遵循的是先进先出&#xff0c;后进后出的原则&#xff0c;基…

循环数组、对象的方法(超实用)

&#xff08;前言&#xff1a;每一个方法我都会举例说明&#xff0c;为了避免混淆&#xff0c;所有方法例子中都使用同一个数组arr和对象obj&#xff1b;另外&#xff0c;由于 forEach太low&#xff0c;every太不常用&#xff0c;所以直接略过&#xff09; 1. for in &#x…

循环数组 及 实现

数组 是一种 线性结构&#xff0c; 在内存中是一段 连续的内存 存储空间存储。 那么 如何实现循环的数组呢&#xff1f; 什么是循环数组&#xff1f; 循环数组 就是 数组的头尾是相连的。 假如有一个数组 [3,7,2,9,1,5] , 形成的环形数组 如下图&#xff1a; 用代码实现&am…

js数组转换为数组对象

let arr ["刘备","关羽","张飞","赵云","马超","黄忠"]; let obj {}; // 将数组转化为对象 for (let key in arr) {obj[key] arr[key];}; let newObj Object.keys(obj).map(val > ({label: obj[val],value…

js 数组转对象方法

记录将数组转成对象方法 let array [1,2,3,4,5]; let obj {}; obj Object.assign({}, array) console.log(obj); // {1,2,3,4,5}

js数组添加对象

一般业务都会有在数组里添加对象属性的需求 以下列出几种常见的添加对象的方法供大家参考 一、最常见的方法&#xff1a;push&#xff08;尾部添加&#xff09; 业务场景 arr [{num:1},{num:2},{num:3}];newArr arr.push({num:4})console.log(arr) 结果&#xff1a; 二、…

js 多维数组/对象转一维数组对象

多维对象转数组&#xff1a; let objTree {name: 河南,children: {name: 洛阳,children: {name: 洛宁,children: {name: 兴华,},},},}function toList(obj, listre) {for (let key in obj) {if (typeof obj[key] object) {console.log(是对象, obj[key])toList(obj[key], li…

jQuery数组对象转javascript数组

当我们在前端开发中&#xff0c;使用了jQuery时&#xff0c;我们通常通过$(".box-item")的方式获取的是一个jQuery对象是一个类数组对象&#xff0c;当我们需要向后台传输的数据中&#xff0c;使用的是javascript数组&#xff0c;或者有时候&#xff0c;我们需要将jQ…

js 三维数组转对象数组 二维数组转对象数组

1. 三维数组转对象数组 输出&#xff1a; 代码如下&#xff1a; let dataArr [[[109.654541015625, 29.34387539941801],[110.467529296875, 59.34387539941801],[109.654541015625, 30.050076521698735],],]let list []dataArr[0].forEach(item > {let obj {lon: item[0…

如何在 JavaScript 中将数组转为对象

首先&#xff0c;我们需要明白对象具有键和值。 const object {key: value } 如果我们想把某个东西转换成一个对象&#xff0c;我们需要传递具有这两个要求的东西&#xff1a;键和值。 满足这些要求的参数有两种类型&#xff1a; 具有嵌套键值对的数组 Map 对象 数组 这是一个…

第二类斯特林数

概要&#xff1a; 第二类斯特林数表示将n个不同的元素分成m个集合的方案数。 代码 s[i][j]实现代码&#xff1a; const int mod1e97;//取模 LL s[N][N];//存放要求的第一类Stirling数 void init(){memset(s,0,sizeof(s));s[1][1]1;for(int i2;i<N-1;i){for(int j1;j<…

斯特林数

斯特林数分为第一类斯特林数和第二类斯特林数&#xff0c;第一类斯特林数分为有符号斯特林数和无符号斯特林数&#xff1b; 1.什么是圆排列&#xff1f; 圆排列是把n个数中拿出k个数组成一个圆的种类数&#xff0c;则这里组成m个圆排列的意思是组成m个不同的圆的种类数&…

斯特林数(Stirling)

第一类斯特林数 第一类斯特林数表示的是将n个不同元素分成k个不同的环的方案数。两个环不相同当且仅当这两个环不能通过旋转得到。记作s(n,k). s(n,k)的递推公式&#xff1a; s(n,k)(n-1)*s(n-1,k)s(n-1,k-1) ,1<k<n 边界条件&#xff1a;s(n,0)0 ,n>1 s(n,n)1 ,n…

斯特林数(Siteling_Number)

一、基本概念 斯特林数出现在许多组合枚举问题中. 第一类斯特林数 StirlingS1[n,m]&#xff0c; 给出恰包含 m 个圈的 n 个元素 的排列数目. 斯特林数满足母函数关系 . 注意某些 的定义与 Mathematica 中的不同&#xff0c;差别在于因子 . 第二类斯特林数 StirlingS2[n,m]给…

斯特林数(数论)

斯特林数&#xff1a;stirling 概念&#xff1a; 1、第一类斯特林数&#xff1a;把1~n排列成k个非空循环的方案数&#xff0c;用小写s(n,k)或[n k]表示 2、第二类斯特林数&#xff1a;将1~n排成k个非空集合的方案数&#xff0c;用大写S(n,k)或{n,k}表示 第一类斯特林数&…

组合数学 —— 斯特林数(Stirling)

【第一类斯特林数】 1.定理 第一类斯特林数 S1(n,m) 表示的是将 n 个不同元素构成 m 个圆排列的数目。 2.递推式 设人被标上1,2,.....p&#xff0c;则将这 p 个人排成 m 个圆有两种情况&#xff1a; 在一个圆圈里只有标号为 p 的人自己&#xff0c;排法有 S1(n-1,m-1) 个。…