时间格式化神器:智能显示相对时间

根据你的需求,我们需要实现一个时间格式化函数,能够将时间戳或日期字符串转换为相对时间显示(如"几分钟前"、"昨天"等)。以下是解决方案:

小于1小时:显示"x分钟前"

今天内:显示"x小时前"

昨天:显示"昨天"

更早:显示完整日期

技术选型:

使用Day.js处理日期

需要计算时间差和日期比较

实现方案:

  1. 安装Day.js
bash 复制代码
npm install dayjs
  1. 创建时间格式化工具函数
typescript 复制代码
// utils/dateFormat.js
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import 'dayjs/locale/zh-cn' // 如果需要中文显示

dayjs.extend(relativeTime)
dayjs.locale('zh-cn') // 设置中文

export function formatRelativeTime(date) {
  const now = dayjs()
  const target = dayjs(date)
  const diffInMinutes = now.diff(target, 'minute')
  const diffInHours = now.diff(target, 'hour')
  const diffInDays = now.diff(target, 'day')

  if (diffInMinutes < 60) {
    return `${diffInMinutes}分钟前`
  } else if (diffInDays < 1) {
    return `${diffInHours}小时前`
  } else if (diffInDays === 1) {
    return '昨天'
  } else if (diffInDays === 2) {
    return '前天'
  } else if (diffInDays < 7) {
    return `${diffInDays}天前`
  } else {
    return target.format('YYYY-MM-DD')
  }
}
  1. 在Vue组件中使用
    修改你的index.vue文件:
typescript 复制代码
<script setup>
import { formatRelativeTime } from '@/utils/dateFormat'

const list = ref([
  // 你的数据列表
  { created_at: '2023-07-20 10:00:00' },
  { created_at: '2023-07-21 15:30:00' },
  { created_at: new Date() } // 当前时间
])
</script>

<template>
  <div v-for="item in list" :key="item.id">
    <!-- 使用格式化函数 -->
    <span>{{ formatRelativeTime(item.created_at) }}</span>
  </div>
</template>
  1. 高级优化版本(支持多种格式)
typescript 复制代码
// utils/dateFormat.js
export function smartFormat(date, options = {}) {
  const now = dayjs()
  const target = dayjs(date)
  const diff = {
    minutes: now.diff(target, 'minute'),
    hours: now.diff(target, 'hour'),
    days: now.diff(target, 'day'),
    weeks: now.diff(target, 'week'),
    months: now.diff(target, 'month')
  }

  if (diff.minutes < 1) {
    return '刚刚'
  } else if (diff.minutes < 60) {
    return `${diff.minutes}分钟前`
  } else if (diff.hours < 24 && target.isSame(now, 'day')) {
    return `${diff.hours}小时前`
  } else if (diff.days === 1 || (diff.days < 2 && !target.isSame(now, 'day'))) {
    return '昨天 ' + target.format('HH:mm')
  } else if (diff.days < 7) {
    return `${diff.days}天前`
  } else if (diff.weeks < 4) {
    return `${diff.weeks}周前`
  } else {
    return target.format(options.format || 'YYYY-MM-DD HH:mm')
  }
}
  1. 使用示例
typescript 复制代码
<script setup>
import { smartFormat } from '@/utils/dateFormat'

// 使用不同格式
console.log(smartFormat('2023-07-20')) // "3周前"
console.log(smartFormat(new Date(), { format: 'MM-DD' })) // "07-23"
</script>

关键点说明:

时区处理:Day.js默认使用本地时区

性能优化:避免在模板中频繁创建Day.js实例

国际化:可以通过更改locale支持多语言

边界情况:处理了"刚刚"、"前天"等特殊情况

相关推荐
kyriewen11 小时前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
山河木马11 小时前
矩阵专题2-怎么创建视图矩阵(uViewMatrix)
javascript·webgl·计算机图形学
tangdou36909865513 小时前
AI真好玩系列-2分钟快速了解DeepAgents | Quick Guide to DeepAgents in 2 Minutes
前端·javascript·后端
张元清13 小时前
React useIntersectionObserver Hook:懒加载与可见性检测(2026)
javascript·react.js
彭于晏爱编程13 小时前
纯 JS + Node,一个下午手搓了能读懂公司代码的 AI 助手,老板以为我转行了
前端·javascript
妙码生花14 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十四):眨眼小人登录页制作
前端·javascript·ai编程
妙码生花14 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十三):前端路由初始化
前端·javascript·ai编程
PBitW14 小时前
GPT训练我的第四天,被打惨了!!!😭😭😭
前端·javascript·面试
DarkLONGLOVE14 小时前
快速上手 Pinia!Vue3 极简状态管理使用教程
javascript·vue.js
mackbob14 小时前
.eslintrc.js详细配置说明
javascript