持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
使用
第一需要定义方法
方法传递两个时间参数,如果只传入一个,就是和当前时间比较(参数格式:2022-10-1 12:00:00 || 2022/10/1 12:00:00, 以及:2022-10-1 || 2022/10/1) ```javascript function dayCha(time, twoTime) { time = time.replace(new RegExp("-", "gm"), "/"); if (twoTime) { twoTime = twoTime.replace(new RegExp("-", "gm"), "/"); } else { twoTime = new Date(); } // 计算比较日期 const getMaxMinDate = (time, twoTime, type) => {}
// 相差年份 const getYear = (time, twoTime) => {}
// 相差月份 const getMonth = (time, twoTime, value) => {}
// 相差天数 const getDay = (time, twoTime, value) => {}
// 相差小时 const getHour = (time, twoTime, value) => {}
// 相差分钟 const getMinute = (time, twoTime, value) => {}
// 相差秒 const getSecond = (time, twoTime, value) => {}
// 相差年月日时分秒 const getDffeYMDHMS = (time, twoTime) => {}
// 获取对应值并返回 let chaYear = getYear(time, twoTime) let chaMonth = getMonth(time, twoTime) let chaDay = getDay(time, twoTime) let chaHour = getHour(time, twoTime) let chaMinute = getMinute(time, twoTime) let chaSecond = getSecond(time, twoTime) let chaDffeYMDHMS = getDffeYMDHMS(time, twoTime) return { chaYear, chaMonth, chaDay, chaHour, chaMinute, chaSecond,chaDffeYMDHMS } } ```
第二内部方法一一说明
计算比较日期
getMaxMinDate()
是用于计算比较日期的时间
- 参数是比较的两个时间,以及type(month:计算相差年需要的,day:计算相差月需要的),使用
2016-8-17
和2019-6-15
举例:
如2016-8-17和2019-6-15计算相差时间,通过getMaxMinDate()
计算出来的maxMinTong:2019-8-17,minTime:2016-8-17,maxTime:2019-6-15
然后理论上2016-8-17(对比的开始时间
)到2019-8-17是足足的3年,但是2019-8-17比2019-6-15(对比的结束时间
)大,所以对比的两个时间其实没有满3年,需要减一年
如2016-8-17和2019-6-15计算相差时间,通过getMaxMinDate()
计算出来的maxMinTong:2019-6-17,minTime:2016-8-17,maxTime:2019-6-15
然后我们通过计算(201912+6)-(201612+8)=32,得出2016-8-17(对比的开始时间
)到2019-6-17足足相差32月,但是2019-6-17比2019-6-15(对比的结束时间
)大了,因此没有满足32月,需要减去一月
3. 计算去除年月相差天数时需要减去的足年月天数
:(type:day)
如2016-8-17和2019-6-15计算相差时间,通过getMaxMinDate()
计算出来的maxMinTong:2019-6-17,minTime:2016-8-17,maxTime:2019-6-15
然后通过let dffeDay1 = getDay('2016/8/17','2019/6/17')
计算出相差的天数,但是由于2019-6-17比2019-6-15(对比的结束时间
)大了,所以不能减去当前算出来的dffeDay1
天,需要dffeDay1 = dffeDay1 - getDay(2019/5/17, '2019/6/17')
(需要减去最大日期前一个月的相同日期到maxMinTong(2019-6-17
),即减去一个月的天数).最后得到dffeDay1为足年月(相差年+相差月)的天数
javascript const getMaxMinDate = (time, twoTime, type) => { let minTime = new Date(time).getTime() - new Date(twoTime).getTime() > 0 ? twoTime : time let maxTime = new Date(time).getTime() - new Date(twoTime).getTime() > 0 ? time : twoTime let maxDateDay = new Date(new Date(maxTime).getFullYear(), new Date(maxTime).getMonth() + 1, 0).getDate() let maxMinDate = new Date(minTime).getDate() > maxDateDay ? maxDateDay : new Date(minTime).getDate() let maxMinTong = null if (type == 'month') { maxMinTong = new Date(maxTime).getFullYear() + '/' + (new Date(minTime).getMonth() + 1) + '/' + maxMinDate + ' ' + new Date(minTime).toLocaleTimeString('chinese',{hour12:false}) } else { maxMinTong = new Date(maxTime).getFullYear() + '/' + (new Date(maxTime).getMonth() + 1) + '/' + maxMinDate + ' ' + new Date(minTime).toLocaleTimeString('chinese',{hour12:false}) } return { minTime, maxTime, maxMinTong } }
- 相差年份
getYear()
是用于计算相差年份
1.time:比较的第一时间
2.twoTime:比较的第二个时间 ```javascript const getYear = (time, twoTime) => { let oneYear = new Date(time).getFullYear() let twoYear = new Date(twoTime).getFullYear() // 计算出与最小日期的日时分相同的最大日期的值 // 如2016-8-17和2019-6-30,计算出来的maxMinTong为2019-8-17 const { minTime, maxTime, maxMinTong } = getMaxMinDate(time, twoTime, 'month') // 计算相差多少年 let chaYear = Math.abs(oneYear - twoYear) // 如果计算出的maxMinTong(如2019-8-17)大于了最大日期,则表示最后一年没有满,需要减一 if (new Date(maxMinTong).getTime() > new Date(maxTime).getTime()) { chaYear-- } return chaYear }
```
- 相差月份
getMonth()
是用于计算相差月份
1.time:比较的第一时间
2.twoTime:比较的第二个时间
3.value:需要减去的月份(基本上是减去足年的月份) javascript const getMonth = (time, twoTime, value) => { let oneMonth = new Date(time).getFullYear() * 12 + (new Date(time).getMonth() + 1) let twoMonth = new Date(twoTime).getFullYear() * 12 + (new Date(twoTime).getMonth() + 1) // 计算出与最小日期的日时分相同的最大日期的值 // 如2016-8-17和2019-6-30,计算出来的maxMinTong为2019-6-17 const { minTime, maxTime, maxMinTong } = getMaxMinDate(time, twoTime, 'day') // 计算最小日期到maxMinTong(如2019-6-17)的月份,这样刚好对应月日 let chaMonth = Math.abs(oneMonth - twoMonth) // 如果计算出来的maxMinTong(如2019-6-17)大于最大日期,则表示最后一月没有满,需要减一 if (new Date(maxMinTong).getTime() > new Date(maxTime).getTime()) { chaMonth-- } if (value) { return chaMonth - value } else { return chaMonth } }
- 相差天数
getDay()
是用于计算相差天数
1.time:比较的第一时间
2.twoTime:比较的第二个时间
3.value:需要减去的天数份(基本上是减去相差足年月换算的天数) javascript const getDay = (time, twoTime, value) => { let chaTime = Math.abs(new Date(time).getTime() - new Date(twoTime).getTime()); if (value) { return parseInt(chaTime / 86400000) - value } else { return parseInt(chaTime / 86400000) } }
- 相差小时
getHour()
是用于计算相差小时
1.time:比较的第一时间
2.twoTime:比较的第二个时间
3.value:需要减去的小时(基本上是减去相差足天的小时) javascript const getHour = (time, twoTime, value) => { let chaTime = Math.abs(new Date(time).getTime() - new Date(twoTime).getTime()); if (value) { return parseInt(chaTime / 3600000) - value } else { return parseInt(chaTime / 3600000) } }
- 相差分钟
相差分钟()
是用于计算相差分钟
1.time:比较的第一时间
2.twoTime:比较的第二个时间
3.value:需要减去的分钟数(基本上是减去足小时的分钟数) ```javascript
const getMinute = (time, twoTime, value) => { let chaTime = Math.abs(new Date(time).getTime() - new Date(twoTime).getTime()); if (value) { return parseInt(chaTime / 60000) - value } else { return parseInt(chaTime / 60000) } }
```
- 相差秒
getSecond()
是用于计算相差秒
1.time:比较的第一时间
2.twoTime:比较的第二个时间
3.value:需要减去的秒数(基本上是减去足分钟的秒数) javascript const getSecond = (time, twoTime, value) => { let chaTime = Math.abs(new Date(time).getTime() - new Date(twoTime).getTime()); if (value) { return parseInt(chaTime / 1000) - value } else { return parseInt(chaTime / 1000) } }
计算相差年月日时分秒
(重头戏)
getDffeYMDHMS()
是用于计算相差年月日时分秒
1.time:比较的第一时间
2.twoTime:比较的第二个时间
3.详解:
- a) 首先通过
getYear()
计算出相差年份 - b) 通过
getMonth()
计算出相差月份,但是这个计算出的月份将上面的相差年也是转成成月份数的,因此需要:getMonth(time, twoTime, dffeYear * 12)
,传入需要减去的年*12
- c) 通过
getDay()
计算出相差天数,同上,我们需要减去一些天数(相差年,相差月计算转换成的天数),因此需要:getDay(time, twoTime, dffeDay1)
,dffeDay1的具体详解可以看详解 - d) 通过
dffeHour()
计算出相差的小时,同上需要减去一些时间,因此需要:getHour(time, twoTime, getDay(time, twoTime) * 24)
- f) 通过
getMinute()
计算出相差的分钟,同上需要减去一些时间,因此需要:getMinute(time, twoTime, (getDay(time, twoTime) * 24 * 60 + dffeHour * 60))
- g) 通过
getSecond()
计算出相差的秒,同上需要减去一些时间,因此需要:getSecond(time, twoTime, (getDay(time, twoTime) * 24 * 60 * 60 + dffeHour * 60 * 60 + dffeMinute * 60))
javascript // 相差年月日时分秒 const getDffeYMDHMS = (time, twoTime) => { // 计算出与最小日期的日时分相同的最大日期的值 // 如2016-8-17和2019-6-30,计算出来的maxMinTong为2019-6-17 const { minTime, maxTime, maxMinTong } = getMaxMinDate(time, twoTime, 'day') // 计算最小日期到(如:2019-6-17)的天数,这样算出来的天数刚好数足月的 let dffeDay1 = getDay(minTime, maxMinTong) // 判断一下,如果计算出来的(如:2019-6-17)大于最后的日期(如2019-6-30)就需要减去(2019-6-30到2019-6-17的天数,否则不需要) if (new Date(maxMinTong).getTime() > new Date(maxTime).getTime()) { let prevMonth = new Date(maxMinTong).getMonth() - 1 let lastTime=new Date(maxMinTong).setMonth(prevMonth) dffeDay1 = dffeDay1 - getDay((new Date(lastTime).getFullYear() + '/' + (new Date(lastTime).getMonth()+1) + '/' + new Date(lastTime).getDate()), maxMinTong) } let dffeYear = getYear(time, twoTime) let dffeMonth = getMonth(time, twoTime, dffeYear * 12) let dffeDay = getDay(time, twoTime, dffeDay1) let dffeHour = getHour(time, twoTime, getDay(time, twoTime) * 24) let dffeMinute = getMinute(time, twoTime, (getDay(time, twoTime) * 24 * 60 + dffeHour * 60)) let dffeSecond = getSecond(time, twoTime, (getDay(time, twoTime) * 24 * 60 * 60 + dffeHour * 60 * 60 + dffeMinute * 60)) console.log(`${dffeYear}年${dffeMonth}月${dffeDay}日 ${dffeHour}:${dffeMinute}:${dffeSecond}`) return { dffeYear, dffeMonth, dffeDay, dffeHour, dffeMinute, dffeSecond } }
第三使用方法
将对应的方法放到dayCha()
里面
最后使用:
javascript dayCha('2016-8-17','2019-6-15') // 2年9月29日 0:0:0 // { // chaDay:1032, // chaHour:24768, // chaMinute: 1486080, // chaMonth: 33, // chaSecond: 89164800, // chaYear: 2, // chaDffeYMDHMS:{ // dffeDay: 29, // dffeHour: 0, // dffeMinute: 0, // dffeMonth: 9, // dffeSecond: 0, // dffeYear: 2 // } // }