🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[info] 时间戳格式化日期 ~~~ /** * @description 时间格式化 * @param dateTime { number } 时间戳 * @param fmt { string } 时间格式 * @return { string } */ // yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 export const timeFormat = (dateTime: number, fmt = 'yyyy-mm-dd') => { // 如果为null,则格式化当前时间 if (!dateTime) { dateTime = Number(new Date()) } // 如果dateTime长度为10或者13,则为秒和毫秒的时间戳,如果超过13位,则为其他的时间格式 if (dateTime.toString().length == 10) { dateTime *= 1000 } const date = new Date(dateTime) let ret const opt: any = { 'y+': date.getFullYear().toString(), // 年 'm+': (date.getMonth() + 1).toString(), // 月 'd+': date.getDate().toString(), // 日 'h+': date.getHours().toString(), // 时 'M+': date.getMinutes().toString(), // 分 's+': date.getSeconds().toString() // 秒 } for (const k in opt) { ret = new RegExp('(' + k + ')').exec(fmt) if (ret) { fmt = fmt.replace( ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0') ) } } return fmt } ~~~ ~~~ /** * 时间格式化 * @param time 时间 * @param format 格式 * @returns {string} */ export function toDateString(time, format) { if (!time) { return ''; } if (typeof time === 'string') { time = time.replace(/-/g, '/'); } else if (typeof time === 'number' && String(time).length === 10) { time = time * 1000; // 10位时间戳处理 } const date = new Date(time), ymd = [ digit(date.getFullYear(), 4), digit(date.getMonth() + 1), digit(date.getDate()) ], hms = [ digit(date.getHours()), digit(date.getMinutes()), digit(date.getSeconds()) ]; return (format || 'yyyy-MM-dd HH:mm:ss') .replace(/yyyy/g, ymd[0]) .replace(/MM/g, ymd[1]) .replace(/dd/g, ymd[2]) .replace(/HH/g, hms[0]) .replace(/mm/g, hms[1]) .replace(/ss/g, hms[2]); } ~~~ ~~~ /** * 倒计时 * @param endTime 结束时间 * @param serverTime 服务端当前时间 * @param callback 回调 * @returns {number} 定时器实例 */ export function countdown(endTime, serverTime, callback) { let type = typeof serverTime === 'function', end = new Date(endTime).getTime(), now = new Date((!serverTime || type) ? new Date().getTime() : serverTime).getTime(), count = end - now, time = [ Math.floor(count / (1000 * 60 * 60 * 24)), // 天 Math.floor(count / (1000 * 60 * 60)) % 24, // 时 Math.floor(count / (1000 * 60)) % 60, // 分 Math.floor(count / 1000) % 60 // 秒 ]; if (type) { callback = serverTime; } let timer = setTimeout(() => { this.countdown(endTime, now + 1000, callback); }, 1000); callback && callback(count > 0 ? time : [0, 0, 0, 0], serverTime, timer); if (count <= 0) { clearTimeout(timer); } return timer; } ~~~ ~~~ /** * 时间语义化 * @param time 时间 * @param onlyDate 超过30天是否仅返回日期 * @returns {string} */ export function timeAgo(time, onlyDate) { if (!time) { return ''; } if (typeof time === 'string') { time = time.replace(/-/g, '/'); } let arr = [[], []], stamp = new Date().getTime() - new Date(time).getTime(); // 30天以上返回具体日期 if (stamp > 1000 * 60 * 60 * 24 * 31) { stamp = new Date(time); arr[0][0] = this.digit(stamp.getFullYear(), 4); arr[0][1] = this.digit(stamp.getMonth() + 1); arr[0][2] = this.digit(stamp.getDate()); // 是否输出时间 if (!onlyDate) { arr[1][0] = this.digit(stamp.getHours()); arr[1][1] = this.digit(stamp.getMinutes()); arr[1][2] = this.digit(stamp.getSeconds()); } return arr[0].join('-') + ' ' + arr[1].join(':'); } if (stamp >= 1000 * 60 * 60 * 24) { return ((stamp / 1000 / 60 / 60 / 24) | 0) + '天前'; } else if (stamp >= 1000 * 60 * 60) { return ((stamp / 1000 / 60 / 60) | 0) + '小时前'; } else if (stamp >= 1000 * 60 * 3) { return ((stamp / 1000 / 60) | 0) + '分钟前'; } else if (stamp < 0) { return '未来'; } else { return '刚刚'; } } ~~~ ~~~ // 日期转换 -- 年月日 formatDate(item) { if (item != null) { var datetime = new Date(item); var year = datetime.getFullYear(); var month = datetime.getMonth() + 1; //js从0开始取 var date = datetime.getDate(); if (month < 10) { month = '0' + month; } if (date < 10) { date = '0' + date; } var time = year + '-' + month + '-' + date return time; } return ''; } }, ~~~