javascript封装一个支持Date对象、字符串、时间戳等多类型时间输入,并能将其转换为自定义格式字符串的时间格式化工具函数。

// 日期格式化  年月日时分秒
/**
 * 时间格式化函数
 * @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
  }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值