/**
* 工具类 - 时间相关
* @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}`
}