28、常用时间工具方法集合-上

93 阅读1分钟
/**
 * 工具类 - 时间相关
 * @module  js/utils-time
 * @description 常用时间工具方法集合
 */
 
 /**
 * 分钟转换为"XX天XX小时XX分钟XX秒"格式
 * @param {String} value 分钟数
 * @param {Boolean} isFormatted 24小时内,显示为00:00:00格式
 */
function secondToTimeChar (value, isFormatted) {
  if (!value || value < 0) {
    return '0'
  }
  const M = 60 // 一分钟
  const H = 60 * 60 // 一小时
  const D = 60 * 60 * 24 // 一天

  let time = +value
  let day = 0
  let hour = 0
  let minute = 0
  let second = 0
  if (time >= D) {
    day = Math.floor(time / D)
    time = time % D
  }
  if (time >= H && time < D) {
    hour = Math.floor(time / H)
    time = time % H
  }
  if (time >= M && time < H) {
    minute = Math.floor(time / M)
    time = time % M
  }
  second = time
  if (isFormatted) {
    return `${hour < 10 ? `0${hour}` : hour}:${minute < 10 ? `0${minute}` : minute}:${second < 10 ? `0${second}` : second}`
  }
  return `${day ? `${day}天` : ''}${hour ? `${hour}小时` : ''}${minute ? `${minute}分钟` : ''}${second ? `${second}秒` : ''}`
},
// 格式化时间
function dateFormat(date, format) {
	let format1 = format;
	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 (!format1) {
		format1 = 'yyyy-MM-dd';
	}

	if (/(y+)/.test(format1)) {
		format1 = format1.replace(
			RegExp.$1,
			(date.getFullYear() + '').substr(4 - RegExp.$1.length)
		);
	}

	if (/(S+)/.test(format1)) {
		format1 = format1.replace(
			RegExp.$1,
			(date.getMilliseconds() + '').substr(3 - RegExp.$1.length)
		);
	}

	for (var k in o) {
		if (new RegExp('(' + k + ')').test(format1)) {
			format1 = format1.replace(
				RegExp.$1,
				RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
			);
		}
	}
	return format1;
}

function getTimeRange(day = 7, turnDateObj = false) {
	let startTimeStr =
		new Date(dateFormat(new Date(), 'yyyy-MM-dd') + ' 00:00:00').getTime() - day * 24 * 60 * 60 * 1000;
	let startTime = toLocaleStringByMs(startTimeStr);
	let endTime = dateFormat(new Date(), 'yyyy-MM-dd') + ' 23:59:59';
	console.log(startTime, endTime);
	if (turnDateObj) {
		return [new Date(startTime), new Date(endTime)];
	} else {
		return [startTime, endTime];
	}
}

const REG = {
	TIME: /^([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/,
	DATE: /^\d{4}-(0[0-9]|1[0-2])-([0-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/,
	DATE_M_D_Y: /^(0[0-9]|1[0-2])-([0-2][0-9]|3[0-1])-\d{4} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/,
	DATE_Z: /^\d{4}(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3])[0-5][0-9][0-5][0-9]Z$/
};

/**
 * add Zero 月日时分秒补0函数
 */
function addZero(time) {
	let newTime = time > 9 ? time : '0' + time;
	return newTime;
}

/**
 * 校验时间格式
 * @param {string} time 时间格式,如 10:00:00
 */
function valifyTime(time) {
	const reg = /^\d{2}:\d{2}:\d{2}$/;
	return reg.test(time);
}

/**
 * 判定两组时间序列是否存在重复(交叉或包含)
 * @param {array} time1Arr 时间范围,如 [10:00:00, 12:00:00]
 * @param {array} time2Arr 时间范围,如 [09:00:00, 23:00:00]
 */
function isTimeContainTime(time1Arr, time2Arr) {
	let timeArr;
	let validate = true;
	// 确保两组时间范围格式正确
	if (!Array.isArray(time1Arr) || !Array.isArray(time2Arr)) {
		throw new Error('Please enter two array.');
	}
	if (time1Arr.length !== 2 || time2Arr.length !== 2) {
		throw new Error('Please enter currect time.');
	}
	timeArr = [...time1Arr, ...time2Arr];
	for (let time of timeArr) {
		if (!valifyTime(time)) {
			throw new Error('Please enter currect time.');
		}
	}

	// 检验时间是否存在重复
	if (
		(time2Arr[0] > time1Arr[0] && time2Arr[0] < time1Arr[1]) ||
		(time2Arr[1] > time1Arr[0] && time2Arr[1] < time1Arr[1])
	) {
		validate = false;
	}
	if (
		(time1Arr[0] > time2Arr[0] && time1Arr[0] < time2Arr[1]) ||
		(time1Arr[1] > time2Arr[0] && time1Arr[1] < time2Arr[1])
	) {
		validate = false;
	}

	return validate;
}

/**
 * 将时间转换为UTC时间字符串,支持格式 hh:mm:ss
 * @description 按源格式返回
 * @param {string} timeStr 源时间
 * @returns {object} 包含time和日期偏差
 */
function toISOStringByTime(timeStr) {
	const time = {};
	let date = new Date(`2000/10/24 ${timeStr}`);
	time.d = date.getUTCDate();
	time.h = addZero(date.getUTCHours());
	time.min = addZero(date.getUTCMinutes());
	time.s = addZero(date.getUTCSeconds());

	return {
		offset: time.d - 24,
		time: `${time.h}:${time.min}:${time.s}`
	};
}

/**
 * 将时间转换为UTC时间字符串,支持格式 yyyy-mm-dd hh:mm:ss
 * @description 按源格式返回
 * @param {string} timeStr 源时间
 * @param {string} type str 普通时间格式, utcStr yyyymmddThhmmssZ格式
 */
function toISOStringByDate(timeStr, type = 'str') {
	const time = {};
	let newTime;
	let date = new Date(timeStr.replace(/-/g, '/'));
	time.y = date.getUTCFullYear();
	time.m = addZero(date.getUTCMonth() + 1);
	time.d = addZero(date.getUTCDate());
	time.h = addZero(date.getUTCHours());
	time.min = addZero(date.getUTCMinutes());
	time.s = addZero(date.getUTCSeconds());

	if (type === 'utcStr') {
		newTime = `${time.y}${time.m}${time.d}T${time.h}${time.min}${time.s}Z`;
	} else {
		newTime = `${time.y}-${time.m}-${time.d} ${time.h}:${time.min}:${time.s}`;
	}

	return newTime;
}

/**
 * 将时间转换为UTC时间字符串
 * @description 按源格式返回,目前支持格式1970-01-01 00:00:00
 * @param {string} timeStr 源时间
 * @param {string} type str 普通时间格式, utcStr yyyymmddThhmmssZ格式
 */
function toISOString(timeStr, type) {
	try {
		if (REG.DATE.test(timeStr)) {
			// 格式 yyyy-mm-dd hh:mm:ss
			return toISOStringByDate(timeStr, type);
		} else if (REG.TIME.test(timeStr)) {
			// 格式 hh:mm:ss
			return toISOStringByTime(timeStr);
		}
	} catch (e) {
		return '';
	}

	throw new Error('Please enter date as yyyy-mm-dd hh:mm:ss');
}

/**
 * 将UTC时间转换为本地时间字符串,支持格式 hh:mm:ss
 * @description 默认传入的为UTC时间,此处由于各版本浏览器支持性不一,故使用Date.UTC()
 * @param {string} timeStr 源时间
 * @returns {object} 包含time和日期偏差
 */
function toLocaleStringByTime(timeStr) {
	const time = {};

	let timeList = timeStr.split(':');

	let utcDate = Date.UTC(2000, 10, 24, timeList[0], timeList[1], timeList[2]);
	let date = new Date(utcDate);

	time.d = date.getDate();
	time.h = addZero(date.getHours());
	time.min = addZero(date.getMinutes());
	time.s = addZero(date.getSeconds());

	return {
		offset: time.d - 24,
		time: `${time.h}:${time.min}:${time.s}`
	};
}

/**
 * 将UTC时间转换为本地时间字符串,支持格式 yyyy-mm-dd hh:mm:ss
 * @description 默认传入的为UTC时间,此处由于各版本浏览器支持性不一,故使用Date.UTC()
 * @param {string} timeStr 源时间
 * @param {string} type str 普通时间格式, mmDDyy
 */
function toLocaleStringByDate(timeStr, type = 'str') {
	const time = {};

	let newTime = timeStr.split(' ');
	let dateList = newTime[0].split('-');
	let timeList = newTime[1].split(':');

	let utcDate = Date.UTC(
		dateList[0],
		dateList[1] - 1,
		dateList[2],
		timeList[0],
		timeList[1],
		timeList[2]
	);
	let date = new Date(utcDate);

	time.y = date.getFullYear();
	time.m = addZero(date.getMonth() + 1);
	time.d = addZero(date.getDate());
	time.h = addZero(date.getHours());
	time.min = addZero(date.getMinutes());
	time.s = addZero(date.getSeconds());
	if (type === 'mmDDyy') {
		return `${time.m}-${time.d}-${time.y} ${time.h}:${time.min}:${time.s}`;
	}
	return `${time.y}-${time.m}-${time.d} ${time.h}:${time.min}:${time.s}`;
}