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

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

小于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支持多语言

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

相关推荐
程序喵大人7 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng8 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
shawxlee8 小时前
vue3在public下封装config.js自定义配置动态数据,可在打包后直接修改,方便后端部署及后续维护
前端·javascript·经验分享·vue·团队开发·js·项目优化
kyriewen9 小时前
我给前端项目的接口请求套了6层保护——才发现以前一直在裸奔
前端·javascript·面试
wdfk_prog9 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕9 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫9 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通10 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
郝亚军10 小时前
如何安装webstorm、Node.js和vue CLI
前端·javascript·vue.js
AC赳赳老秦11 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw