公司项目里最近总是会用到,时间方面的一些计算 和时间范围的一些限制,导致会有冗余代码,所以为了方便使用就封装成了js小工具,供全局使用,直接上代码!(有问题还请指出,或者有更好的方法欢迎评论)
给选定的日期添加月数或者年数
/**
* 给定选中的日期添加月数或者添加年数
* @param {*} dateStr 已选中的日期
* @param {*} num 要添加的月数/年数
* @param {*} type 添加类型:1:添加月份;2:添加年份
*/
static addDate(dateStr, num, type) {
var str = ''
str = dateStr.replace(/-/g, '/') // 转为格式"2015/05/26";
// 创建日期对象,并初始化,完成文本转日期
var date = new Date(str)
var year = date.getFullYear() //年
var month = date.getMonth() //月
var day = date.getDate() //日
if (type == '1') {
month += num;
day-=1;
} else if (type == '2') {
year = year + num
day-=1
}
var date2 = new Date(year, month, day) //新的年月
//从新生成的日期是取出月份
month = date2.getMonth()+1;
day = date2.getDate() //月
if (day < 10) {
day = '0' + day
}
if (month < 10) {
month = '0' + month
}
str = date2.getFullYear() + '-' + month + '-' + day
return str
}
给定选中的日期减去月数或者减去年数
/**
* 给定选中的日期减去月数或者减去年数
* @param {*} dateStr 已选中的日期
* @param {*} num 要减去的月数/年数
* @param {*} type 减去类型:1:减去月份;2:减去年份
*/
static subDate(dateStr, num, type) {
var str = ''
str = dateStr.replace(/-/g, '/') // 转为格式"2015/05/26";
// 创建日期对象,并初始化,完成文本转日期
var date = new Date(str)
var year = date.getFullYear() //年
var month = date.getMonth() //月
if (type == '1') {
month = month - num + 1 //月 -num个月 因为js里month从0开始,所以要-1
if (month < 0) {
year--
month += 12
}
if (month < 10) {
month = '0' + month
}
} else if (type == '2') {
year = year - num
month += 1
}
var date2 = new Date(year, month, 0) //新的年月
var day1 = date.getDate()
var day2 = date2.getDate()
if (day1 > day2) {
//防止+6月后没有31天
day1 = day2
}
if (day1 < 10) {
day1 = '0' + day1
}
str = year + '-' + month + '-' + day1
return str
}
添加天数
/**
* 添加天数
* @param {*} dateStr 要改变的时间字符串
* @param {*} num 要添加的天数
*/
static addDateDays(dateStr, num) {
var str = ''
str = dateStr.replace(/-/g, '/') // 转为格式"2015/05/26";
// 创建日期对象,并初始化,完成文本转日期
var date = new Date(str)
date.setDate(date.getDate() + num)
var year = date.getFullYear() //年
var month = date.getMonth() + 1
var day = date.getDate()
// 如果时间选择2019-8月30 31 号 上学期结束时间是闰年 下学期开始时间是3月1号
var cond1 = year % 4 == 0; //条件1:年份必须要能被4整除
var cond2 = year % 100 != 0; //条件2:年份不能是整百数
var cond3 = year % 400 ==0; //条件3:年份是400的倍数
//当条件1和条件2同时成立时,就肯定是闰年,所以条件1和条件2之间为“与”的关系。
//如果条件1和条件2不能同时成立,但如果条件3能成立,则仍然是闰年。所以条件3与前2项为“或”的关系。
//所以得出判断闰年的表达式:
var cond = cond1 && cond2 || cond3;
if (cond && month ==2 && day==29 ) {
day = date.getDate()+1
}
if (month < 10) {
month = '0' + month
}
if (day < 10) {
day = '0' + day
}
return date.getFullYear() + '-' + month + '-' + day
}
两个时间相差的月数
/**
* @param {*} date1 大的时间
* @param {*} date2 小的时间
*/
static differMonth(endData, startData) {
var eData = new Date(endData)
var sData = new Date(startData)
var diffYearNum = eData.getFullYear() - sData.getFullYear()
var diffMonthNum = eData.getMonth() - sData.getMonth()
var diffDayNum = eData.getDate() - sData.getDate()
return diffYearNum * 12 + diffMonthNum + (diffDayNum >= 0 ? 1 : 0)
}
根据两个日期,判断相差天数
/**
* 根据两个日期,判断相差天数
* @param sDate1 开始日期 如:2016-11-01
* @param sDate2 结束日期 如:2016-11-02
* @returns {number} 返回相差天数
*/
static differDays(sDate1, sDate2) {
//Date.parse() 解析一个日期时间字符串,并返回1970/1/1 午夜距离该日期时间的毫秒数
var time1 = Date.parse(new Date(sDate1))
var time2 = Date.parse(new Date(sDate2))
var nDays = Math.abs(parseInt((time2 - time1) / 1000 / 3600 / 24))
return nDays
}
时间格式化
/**
* @param {*} fmt 转换格式
* @param {*} date 时间
*/
static dateFtt(fmt, date) {
//author: meizz
var o = {
'M+': date.getMonth() + 1, //月份
'd+': date.getDate(), //日
'H+': date.getHours(), //小时
'm+': date.getMinutes(), //分
's+': date.getSeconds(), //秒
'q+': Math.floor((date.getMonth() + 3) / 3), //季度
S: date.getMilliseconds() //毫秒
}
if (/(y+)/.test(fmt))
fmt = fmt.replace(
RegExp.$1,
(date.getFullYear() + '').substr(4 - RegExp.$1.length)
)
for (var k in o)
if (new RegExp('(' + k + ')').test(fmt))
fmt = fmt.replace(
RegExp.$1,
RegExp.$1.length == 1
? o[k]
: ('00' + o[k]).substr(('' + o[k]).length)
)
return fmt
}