/* js 日期工具类 */
/**
* 时间戳、日期、字符串格式化,并返回指定格式
* @param date 字符串/日期
* @param fmt 返回的日期格式
* @returns {void | string}
*/
export function dateFormat (date, fmt) {
if (!date) {
return ''
}
date = dealDateStr(date) // 对传过来的日期字符串进行处理,并将其转换成date类型
return fmtCallback(date, fmt)
}
/**
* 日期/字符串转换成时间戳(毫秒)
* @param date 字符串/日期
* @returns {number}
*/
export function dateToTime (date) {
if (!date) {
return 0
}
date = dealDateStr(date) // 对传过来的日期字符串进行处理,并将其转换成date类型
return date.getTime()
}
/**
* * 给日期增加指定时间
* @param date 字符串/日期/时间戳
* @param number 增加数量, 只支持正整数
* @param addType 增加类型,可以是秒(second),分钟(minute),小时(hour),天数(day),月份(mouth),年份(year)
* @param fmt 返回的日期格式。fmt为空,默认返回日期类型
* @returns {string|date|number}
*/
export function dateAdd (date, number, addType, fmt) {
if (!date || (!number && !number !== 0) || !addType) {
return ''
} else if (number === 0) {
return date
}
number = number ? Number(number) : 0 ;
date = dealDateStr(date) // 对传过来的日期字符串进行处理,并将其转换成date类型
switch (addType) {
case 'year': {
if (number >= 0) {
date = date.setFullYear(date.getFullYear() + number);
} else {
date = date.setFullYear(date.getFullYear() - number);
}
break;
}
case 'mouth': {
if (number >= 0) {
date = date.setMonth(date.getMonth() + number);
} else {
date = date.setMonth(date.getMonth() - Math.abs(number));
}
break;
}
case 'day': {
if (number >= 0) {
date = date.setDate(date.getDate() + number);
} else {
date = date.setDate(date.getDate() - Math.abs(number));
}
break;
}
case 'hour': {
if (number >= 0) {
date = date.setHours(date.getHours() + number);
} else {
date = date.setHours(date.getHours() - Math.abs(number));
}
break;
}
case 'minute': {
if (number >= 0) {
date = date.setMinutes(date.getMinutes() + number);
} else {
date = date.setMinutes(date.getMinutes() - Math.abs(number));
}
break;
}
case 'second': {
if (number >= 0) {
date = date.setSeconds(date.getSeconds() + number);
} else {
date = date.setSeconds(date.getSeconds() - Math.abs(number));
}
break;
}
default: {
if (number >= 0) {
date = date.setDate(date.getDate() + number);
} else {
date = date.setDate(date.getDate() - Math.abs(number));
}
break;
}
}
// fmt为空,则按传过来date参数的格式返回
if (!fmt) {
return date
} else {
return dateFormat(date, fmt)
}
}
/**
* 判断date1是否小于date2,如果小于,返回true, 否则返回false(fmt不为空,那么将传过来的日期根据fmt进行格式化,然后按指定日期格式来判断两个日期的大小。fmt为空,但要保证date1,date2的日期格式一致)
* @param date1
* @param date2
* @param fmt 日期格式,可以是字符串,日期,时间戳。如fmt可以为yyyy-MM-dd等
* @returns {boolean}
*/
export function isBefore (date1, date2, fmt) {
if (!date1 || !date2) {
return false
}
let dateArr = dealTowDate(date1, date2, fmt)
return dateArr[0] < dateArr[1]
}
/**
* 判断date1是否小于等于date2,如果小于等于,返回true;否则返回false(fmt不为空,那么将传过来的日期根据fmt进行格式化,然后按指定日期格式来判断两个日期的大小。fmt为空,但要保证date1,date2的日期格式一致)
* @param date1
* @param date2
* @param fmt 日期格式,可以是字符串,日期,时间戳。如fmt可以为yyyy-MM-dd等
* @returns {boolean}
*/
export function isSameOrBefore (date1, date2, fmt) {
if (!date1 || !date2) {
return false
}
let dateArr = dealTowDate(date1, date2, fmt)
return dateArr[0] <= dateArr[1]
}
/**
* 判断date1是否大于date2,如果大于,返回true;否则返回false(fmt不为空,那么将传过来的日期根据fmt进行格式化,然后按指定日期格式来判断两个日期的大小。fmt为空,但要保证date1,date2的日期格式一致)
* @param date1
* @param date2
* @param fmt 日期格式,可以是字符串,日期,时间戳。如fmt可以为yyyy-MM-dd等
* @returns {boolean}
*/
export function isAfter (date1, date2, fmt) {
if (!date1 || !date2) {
return false
}
let dateArr = dealTowDate(date1, date2, fmt)
return dateArr[0] > dateArr[1]
}
/**
* 判断date1是否大于等于date2,如果大于等于,返回true;否则返回false(fmt不为空,那么将传过来的日期根据fmt进行格式化,然后按指定日期格式来判断两个日期的大小。fmt为空,但要保证date1,date2的日期格式一致)
* @param date1
* @param date2
* @param fmt 日期格式,可以是字符串,日期,时间戳。如fmt可以为yyyy-MM-dd等
* @returns {boolean}
*/
export function isSameOrAfter (date1, date2, fmt) {
if (!date1 || !date2) {
return false
}
let dateArr = dealTowDate(date1, date2, fmt)
return dateArr[0] >= dateArr[1]
}
/**
* 判断date1是否等于date2,如果等于,返回true;否则返回false(fmt不为空,那么将传过来的日期根据fmt进行格式化,然后按指定日期格式来判断两个日期的大小。fmt为空,但要保证date1,date2的日期格式一致)
* @param date1
* @param date2
* @param fmt 日期格式,可以是字符串,日期,时间戳。如fmt可以为yyyy-MM-dd等
* @returns {boolean}
*/
export function isSame (date1, date2, fmt) {
if (!date1 || !date2) {
return false
}
let dateArr = dealTowDate(date1, date2, fmt)
return dateArr[0] === dateArr[1]
}
/**
* 获取当前星期几
* @param date
* @returns {string}
*/
export function getDayByChinese (date) {
if (!date) {
return ''
}
date = dealDateStr(date) // 对传过来的日期字符串进行处理,并将其转换成date类型
var myddy = date.getDay() // 获取存储当前日期
var weekday = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
return weekday[myddy]
}
/**
* 根据传过来的时间戳换算成几天几小时
* @param time
* @returns {string}
*/
export function getDaysByTime (time) {
if (!time) {
return ''
}
time = time ? Number(time) : 0
time = (time / 3600000) // 获取小时数
let day = time > 0 ? Math.floor(time / 24) : Math.ceil(time / 24)
let hour = time % 24
let str = (day ? day + '天' : '') + (hour ? hour.toFixed(0) + '小时' : '')
return str
}
// 对传过来的日期字符串进行处理,并将其转换成date类型
function dealDateStr (date) {
var regPos = /^[1-9]+[0-9]*]*$/; // 正整数
var regNeg = /^-[0-9]*[1-9][0-9]*$/; // 负整数
if (regPos.test(date) || regNeg.test(date)) { // date为时间戳,直接转成日期类型
date = new Date(Number(date))
} else if (typeof date === 'string') { // 如果字符串参数为日期格式,转换成日期格式
if (date.toString().indexOf('-') > 0) {
date = date.replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '').replace(/(-)/g, '/') // 将 '-' 替换成 '/'
} else if (date.toString().indexOf('.') > 0) {
date = date.replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '').replace(/\./g, '/') // 将 '.' 替换成 '/'
}
if(date.indexOf('.000+00:00') >= 0) { // 世界时间转换成北京时间,+8小时
date = date.replace('.000+00:00', '')
date = new Date(date)
date = new Date(date.setHours(date.getHours() + 8))
} else {
date = new Date(date)
}
}
return date
}
// 按fmt格式化日期
function fmtCallback (date, fmt) {
var o = {
'y+': date.getFullYear(), // 年份
'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
}
// 处理两个日期格式,将其转换成时间戳再返回
function dealTowDate (date1, date2, fmt) {
if (fmt) {
date1 = dateToTime(dateFormat(date1, fmt))
date2 = dateToTime(dateFormat(date2, fmt))
} else {
date1 = dateToTime(date1)
date2 = dateToTime(date2)
}
return [date1, date2]
}
js日期工具类,兼容ios
最新推荐文章于 2024-01-24 22:06:57 发布