js时间格式转化器
代码:
export const TimeFormatter = {/*** 解析时间输入,统一为 Date 对象* @param {Date | number | string} input* @returns {Date}*/parse(input) {if (input instanceof Date) return input;if (typeof input === 'number') return new Date(input);if (typeof input === 'string') {const parsed = new Date(input);if (!isNaN(parsed.getTime())) return parsed;}throw new Error('Invalid time input');},/*** 补零*/pad(n) {return n.toString().padStart(2, '0');},/*** 格式化为 yyyy-MM-dd HH:mm:ss(默认使用本地时间)* @param {Date | number | string} input* @param {Object} options* @param {boolean} options.useUTC 是否使用 UTC 展示*/formatFull(input, { useUTC = false } = {}) {const date = TimeFormatter.parse(input);const get = useUTC ? {year: date.getUTCFullYear(),month: date.getUTCMonth() + 1,day: date.getUTCDate(),hour: date.getUTCHours(),minute: date.getUTCMinutes(),second: date.getUTCSeconds()} : {year: date.getFullYear(),month: date.getMonth() + 1,day: date.getDate(),hour: date.getHours(),minute: date.getMinutes(),second: date.getSeconds()};return `${get.year}-${TimeFormatter.pad(get.month)}-${TimeFormatter.pad(get.day)} ${TimeFormatter.pad(get.hour)}:${TimeFormatter.pad(get.minute)}:${TimeFormatter.pad(get.second)}`;},formatDate(input, { useUTC = false } = {}) {const date = TimeFormatter.parse(input);const get = useUTC ? {year: date.getUTCFullYear(),month: date.getUTCMonth() + 1,day: date.getUTCDate()} : {year: date.getFullYear(),month: date.getMonth() + 1,day: date.getDate()};return `${get.year}-${TimeFormatter.pad(get.month)}-${TimeFormatter.pad(get.day)}`;},formatTime(input, { useUTC = false } = {}) {const date = TimeFormatter.parse(input);const get = useUTC ? {hour: date.getUTCHours(),minute: date.getUTCMinutes(),second: date.getUTCSeconds()} : {hour: date.getHours(),minute: date.getMinutes(),second: date.getSeconds()};return `${TimeFormatter.pad(get.hour)}:${TimeFormatter.pad(get.minute)}:${TimeFormatter.pad(get.second)}`;},formatRelative(input) {const date = TimeFormatter.parse(input);const now = Date.now();const time = date.getTime();const diff = Math.floor((now - time) / 1000);if (diff < 60) return `${diff}秒前`;if (diff < 3600) return `${Math.floor(diff / 60)}分钟前`;if (diff < 86400) return `${Math.floor(diff / 3600)}小时前`;if (diff < 2592000) return `${Math.floor(diff / 86400)}天前`;return TimeFormatter.formatDate(input);}
};
TimeFormatter 工具总览
方法名 | 功能描述 | 参数说明 | 返回值示例 |
---|---|---|---|
parse(input) | 将任意时间格式解析为 Date 对象 | input : Date、时间戳、ISO 字符串等 | Date 对象 |
formatFull(input, { useUTC }) | 格式化为完整时间字符串 yyyy-MM-dd HH:mm:ss | useUTC : 是否使用 UTC 展示(默认 false) | "2025-09-12 04:50:42" |
formatDate(input, { useUTC }) | 格式化为日期字符串 yyyy-MM-dd | useUTC : 是否使用 UTC 展示(默认 false) | "2025-09-12" |
formatTime(input, { useUTC }) | 格式化为时间字符串 HH:mm:ss | useUTC : 是否使用 UTC 展示(默认 false) | "04:50:42" |
formatRelative(input) | 转化为相对时间(几分钟前、几小时前) | 无选项,自动使用本地时间 | "3分钟前" 、"2天前" |
示例用法详解
1. 解析时间(统一为 Date 对象)
TimeFormatter.parse('2025-09-11T20:50:42Z'); // → Date 对象(UTC 时间)
TimeFormatter.parse(1694459442000); // → 时间戳转 Date
TimeFormatter.parse(new Date()); // → 原样返回
2. 格式化为完整时间(默认中国时间)
TimeFormatter.formatFull('2025-09-11T20:50:42Z');
// → "2025-09-12 04:50:42" (自动转为中国时间)TimeFormatter.formatFull('2025-09-11T20:50:42Z', { useUTC: true });
// → "2025-09-11 20:50:42" (保持 UTC 展示)
3. 格式化为日期
TimeFormatter.formatDate('2025-09-11T20:50:42Z');
// → "2025-09-12"TimeFormatter.formatDate('2025-09-11T20:50:42Z', { useUTC: true });
// → "2025-09-11"
4. 格式化为时间
TimeFormatter.formatTime('2025-09-11T20:50:42Z');
// → "04:50:42"TimeFormatter.formatTime('2025-09-11T20:50:42Z', { useUTC: true });
// → "20:50:42"
5. 相对时间展示(自动识别时间差)
TimeFormatter.formatRelative(Date.now() - 30 * 1000);
// → "30秒前"TimeFormatter.formatRelative(Date.now() - 5 * 60 * 1000);
// → "5分钟前"TimeFormatter.formatRelative('2025-09-01T08:00:00Z');
// → "X天前" 或直接格式化为日期
使用场景建议
✅ 表格展示:
formatFull()
用于时间列✅ 表单预填:
formatDate()
用于日期选择器✅ 日志记录:
formatTime()
用于精确时间戳✅ 用户界面:
formatRelative()
用于“刚刚”、“几分钟前”等人性化提示✅ 后端对接:
parse()
用于统一处理 Django 返回的 UTC 时间