// 日期格式化 年月日时分秒
/**
* 时间格式化函数
* @param {Object|String|Number} time - 时间输入,可以是Date对象、时间字符串或时间戳
* @param {String} pattern - 输出格式模板,默认值为'{y}-{m}-{d} {h}:{i}'
* @returns {String|null} - 格式化后的时间字符串,如果输入无效则返回null
*/
function parseTime(time, pattern) {
// 参数校验:如果没有传入参数或time为空,则返回null
if (arguments.length === 0 || !time) {
return null
}
// 设置默认格式模板,如果没有提供pattern参数则使用默认值
const format = pattern || '{y}-{m}-{d} {h}:{i}'//'{y}-{m}-{d} {h}:{i}:{s}'
let date
// 如果time已经是Date对象,则直接使用
if (typeof time === 'object') {
date = time
} else {
// 处理字符串类型的时间
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
// 如果字符串是纯数字,则转换为整数
time = parseInt(time)
} else if (typeof time === 'string') {
// 处理ISO格式字符串:将'-'替换为'/', 'T'替换为空格,移除毫秒部分
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.\d{3}/gm),'');
}
// 处理时间戳:如果是10位数字,则转换为毫秒级时间戳
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
// 创建Date对象
date = new Date(time)
}
// 创建时间格式化对象,存储年、月、日、时、分、秒、星期信息
const formatObj = {
y: date.getFullYear(), // 年份(4位数字)
m: date.getMonth() + 1, // 月份(1-12,需加1因为getMonth返回0-11)
d: date.getDate(), // 日期(1-31)
h: date.getHours(), // 小时(0-23)
i: date.getMinutes(), // 分钟(0-59)
s: date.getSeconds(), // 秒(0-59)
a: date.getDay() // 星期(0-6,0代表星期日)
}
// 使用正则替换将格式模板中的占位符替换为实际时间值
// 正则表达式解释:/{([ymdhisa])+}/g
// - { } :匹配字面量的大括号
// - ([ymdhisa])+ :捕获组,匹配方括号内的任意字符(y年、m月、d日、h时、i分、s秒、a星期)一次或多次
// - g :全局匹配标志,匹配所有符合条件的子串
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
// 参数解释:
// - result:正则表达式匹配到的完整子串(包含大括号),例如 '{y}'、'{m}' 等
// - key:正则表达式中第一个捕获组匹配到的内容(即大括号内的字符),例如 'y'、'm' 等
// 获取当前占位符对应的值
let value = formatObj[key]
// 特殊处理星期:将数字转换为中文星期(0→日,1→一,...,6→六)
if (key === 'a') {
return ['日', '一', '二', '三', '四', '五', '六'][value]
}
// 补零处理:如果值小于10且占位符长度大于0,则在前面补零
// 例如:1 → '01',12 → '12'
if (result.length > 0 && value < 10) {
value = '0' + value
}
// 如果值不存在则返回0,否则返回实际值
return value || 0
})
// 返回格式化后的时间字符串
return time_str
}

被折叠的 条评论
为什么被折叠?



