当前位置: 首页 > news >正文

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:ssuseUTC: 是否使用 UTC 展示(默认 false)"2025-09-12 04:50:42"
formatDate(input, { useUTC })格式化为日期字符串 yyyy-MM-dduseUTC: 是否使用 UTC 展示(默认 false)"2025-09-12"
formatTime(input, { useUTC })格式化为时间字符串 HH:mm:ssuseUTC: 是否使用 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 时间

http://www.dtcms.com/a/434836.html

相关文章:

  • 攻防世界-Web-Web_php_unserialize
  • Deep Learning|01 RBF Network
  • 指针步长:C/C++内存操控的核心法则
  • 服装网站建设分析wordpress模板如何用
  • wordpress后台菜单管理程序代码优化网站
  • Windows 常用短文件名(8.3 格式)介绍
  • 【stm32】【edgetx】解析链接脚本文件(ld)
  • 商务网站构建与维护网站建设所有权
  • C语言速成秘籍——跳转语句(goto)
  • WPF实现串口热插拔 (提供百度网盘源代码)
  • 企业网站关键词排名南京比较好的网络策划公司
  • FFmpeg 核心 API 系列:avcodec_find_decoder / avcodec_alloc_context3 / avcodec_open2
  • 文件上传简单的绕过总结
  • Visual Studio Code中launch.json深度解析:C++调试的艺术
  • 天长市建设局网站惠来做网站
  • 51单片机红外遥控
  • Java 集合 “List + Set”面试清单(含超通俗生活案例与深度理解)
  • 云南网站建设哪个好软文广告平台
  • 《嵌入式 – GD32开发实战指南(RISC-V版本)》第8章 PWM输出实现
  • HNU 编译系统 第一次作业
  • 网站怎么做交易平台图片生成网页链接在线
  • 渗透测试中的信息收集:文档元数据
  • minikube 的 kubernetes 入门教程-kubeSphere
  • 深圳 手机网站建设彩妆做推广的网站
  • 网站跳转是什么意思郑州建站网站的公司
  • 老题新解|再求 f(x,n)
  • 【Android cmd命令的执行流程】
  • c++26新功能—constexpr在稳定排序中的应用
  • AI生成悬疑故事
  • 泰山派rk3566烧录