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

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

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

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

相关推荐
Ramble_Naylor2 分钟前
Rust深度解读:异步流(Async Streams)与生成器的处理艺术
开发语言·后端·rust
努力实干11 分钟前
简单工厂模式(Simple Factory Pattern)——C++
开发语言·c++·简单工厂模式
熊猫钓鱼>_>14 分钟前
平行视界兼容模式与魔法变量配置避坑【鸿蒙心迹】
运维·服务器·开发语言·笔记·华为·harmonyos·openharmony
大鹏说大话21 分钟前
PHP 大文件上传解决方案:分片上传完整思路
开发语言·php
tryCbest26 分钟前
Vue3——第 11 篇:组合式 API(上)——setup 与响应式 API 深度解析
前端·javascript·vue.js
tryCbest1 小时前
Vue3——第 13 篇:计算属性与侦听器——computed 与 watch 的进化
前端·javascript·vue.js
Wang's Blog1 小时前
Java 项目实战:交友项目 - 我的访客:需求说明
java·开发语言·交友
用户117953654782 小时前
企业团队编程软件怎么选:AI编程工具的协作与落地能力对比
javascript
布莱克6052 小时前
C++ 中堆和栈的区别详解
开发语言·c++·栈·堆
believed_breadfruit2 小时前
我开源了一个HTML 分页导出工具,解决了复杂页面的内容截断、跨页错乱和长文档白屏问题
前端·javascript·github