根据后端返回的数据,计算出相应的日期时间
作者刚入行一年不到,所以写得不咋地,大佬指教。
目标
后端返回的对象集合中有三个属性,分别是forwarddate、forwardtype、levelfinishdate,目标是通过这三个属性倒推计算出相应时间,例如:
2021-10-02倒推1天就是2021-10-01
2021-10-08倒推1周就是2021-10-01
2021-03-31倒推1月就是2021-02-28
这是后端返回数据数组中的一个对象
{
forwarddate: 2, //乘数
forwardtype: "W", //类型,D为天,W为周,M为月
levelfinishdate: "2021-09-11" //日期
}
实现代码
computeDate(item) { //item为上面传入的一个对象
var num = item.forwarddate //根据日期类型而定,分别是 几天、几周、几月
var dateType = item.forwardtype //日期类型(D:'天',W:'周',M:'月')
var finishDate = new Date(item.levelfinishdate) //将日期转换成标准时间(类似 Thu Jan 01 1970 08:00:01 GMT+0800 (中国标准时间))
if(dateType == 'D') { //判断日期类型
finishDate.setDate(finishDate.getDate()-num) //日期 - 天数
}
else if(dateType == 'W') {
finishDate.setDate(finishDate.getDate()-num*7) //日期 - 周数 x 每周7天
}else if(dateType == 'M') {
var oldDate = finishDate.getDate() //原来是日期的第几天
finishDate.setMonth(finishDate.getMonth()-num) //减去相应月份,当减为负时,年份会自动计算年份的加减
//例如日期为2021-10-0,通过.getDate()就能获取到对应月份总共有多少天
var newDay = new Date(finishDate.getFullYear(),finishDate.getMonth()+1,0).getDate()
// 例如2021-03-31的天数是31日,倒退一个月是2021-02-28,天数是28日;Math.min()为取其中最小的值
// 2021-03-31, 倒退一个月,旧值为31新值为28, 新值小于旧值, 取新值, 为:2021-02-28
// 2021-03-28, 倒退一个月,旧值为28新值为28, 新值等于旧值, 取任意, 为:2021-02-28
// 2021-03-27, 倒退一个月,旧值为27新值为28, 旧值小于新值, 取旧值, 为:2021-02-27
finishDate.setDate(Math.min(oldDate,newDay))
}
//拼接成目标的时间格式 2021-10-01
//注意:data.getMonth()获取月份得时候,会从0开始算起,所以需要加1
return finishDate.getFullYear()
+"-"+
(finishDate.getMonth()+1>9 ? finishDate.getMonth()+1 : `0${finishDate.getMonth()+1}`)
+"-"+
(finishDate.getDate()>9 ? finishDate.getDate() : `0${finishDate.getDate()}`)
},
总结
其中的setDate、setMonth方法最为好用,一开始我也不清楚有这方法,都是先换算成日期的原始值( new Date(2021-10-01).valueOf() )与目标值相减,再转换成正常日期格式;
如果是以天、周为单位,就能使用原始值加减的方法进行换算得出相应结果;但如果是月份,因为每个月的天数都不一样,所以会出现误差,而setDate、setMonth方法会自动进行计算,简化了日期的换算,针不戳。
菜鸟教程 Date 对象
值得注意:
2021-03-31 倒退一个月是 2021-02-28
2021-03-28 倒退一个月也是 2021-02-28