涉及到的公用的方法
/**
* 转时间
* @param {String|Number|dateTime} 时间,时间字符串,时间戳,时间戳字符串都可以
* date不传或传入null 表示取当前时间
*/
function toDate(dateTime) {
let date
// 若传入时间为假值,则取当前时间
if (!dateTime) {
date = new Date()
} else if (/^\d{10}$/.test(dateTime?.toString().trim())) {
// 若为unix秒时间戳,则转为毫秒时间戳(逻辑有点奇怪,但不敢改,以保证历史兼容)
date = new Date(dateTime * 1000)
} else if (typeof dateTime === 'string' && /^\d+$/.test(dateTime.trim())) {
// 若用户传入字符串格式时间戳,new Date无法解析,需做兼容
date = new Date(Number(dateTime))
} else {
// 其他都认为符合 RFC 2822 规范
// 处理平台性差异,在Safari/Webkit中,new Date仅支持/作为分割符的字符串时间
date = new Date(
typeof dateTime === 'string'
? dateTime.replace(/-/g, '/')
: dateTime
)
}
return date
}
格式化时间
/**
* @description 格式化时间,输出时间字符串
* @param {String|Number}时间,时间字符串,时间戳,时间戳字符串都可以
* date不传或传入null 表示取当前时间
* @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd
* @returns {string} 返回格式化后的字符串
*/
function timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') {
const date = toDate(dateTime)
const timeSource = {
'y': date.getFullYear().toString(), // 年
'm': (date.getMonth() + 1).toString().padStart(2, '0'), // 月
'd': date.getDate().toString().padStart(2, '0'), // 日
'h': date.getHours().toString().padStart(2, '0'), // 时
'M': date.getMinutes().toString().padStart(2, '0'), // 分
's': date.getSeconds().toString().padStart(2, '0') // 秒
// 有其他格式化字符需求可以继续添加,必须转化成字符串
}
for (const key in timeSource) {
const [ret] = new RegExp(`${key}+`).exec(formatStr) || []
if (ret) {
// 年可能只需展示两位
const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0
formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex))
}
}
return formatStr
}
格式化时间为中文(如:2024年04月20日 16:23:22)
*
* @description 转时间加文字 例:(2022-12-01 转 2022年12月01日) || (12-01 转 12月01日);
* @param {String|Number} 时间戳,时间字符串(仅支持 转 年月日字符)
* @param {Boolean} isYear 是否有年 默认为true 转 2022年10月12日, false 转 10月12日
* @returns {String} 返回格式化后的字符串
*/
function chineseDate(dateTime = null, isYear = true) {
const date = toDate(dateTime)
const timeSource = {
'y': date.getFullYear().toString(), // 年
'm': (date.getMonth() + 1).toString().padStart(2, '0'), // 月
'd': date.getDate().toString().padStart(2, '0'), // 日
// 有其他格式化字符需求可以继续添加,必须转化成字符串
}
let numStrTime = ''
if (isYear) {
numStrTime = timeSource['y'] + '年' + timeSource['m'] + '月' + timeSource['d'] + '日'
} else {
numStrTime = timeSource['m'] + '月' + timeSource['d'] + '日'
}
return numStrTime
}