You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJS如何将日期转换为小时/分钟前或天/小时前的相对时间格式

React 实现评论相对时间格式化

核心实现分三步:解析输入的日期字符串、计算与当前时间的毫秒差、判断是否为同天后按规则拼接输出字符串,以下是可直接复用的实现方案。

无依赖原生JS实现

不需要引入任何第三方库,直接写工具函数即可,完全匹配要求的输出格式:

const formatRelativeTime = (dateInput) => {
  // 解析输入的日期,支持拿到的 "June 10, 2022, 3:29 PM" 格式
  const targetDate = new Date(dateInput);
  const now = new Date();
  const diff = now.getTime() - targetDate.getTime();

  // 异常边界:未来时间直接返回提示
  if (diff < 0) return 'just now';

  // 时间单位毫秒换算
  const MINUTE = 60 * 1000;
  const HOUR = 60 * MINUTE;
  const DAY = 24 * HOUR;

  // 判断是否为同一天:年、月、日三个维度完全一致
  const isSameDay = 
    targetDate.getFullYear() === now.getFullYear() &&
    targetDate.getMonth() === now.getMonth() &&
    targetDate.getDate() === now.getDate();

  if (isSameDay) {
    const hours = Math.floor(diff / HOUR);
    const minutes = Math.floor((diff % HOUR) / MINUTE);
    // 不足1小时只显示分钟
    if (hours === 0) return `${minutes} minutes ago`;
    // 单复数适配
    const hourText = hours === 1 ? 'hour' : 'hours';
    const minuteText = minutes === 1 ? 'minute' : 'minutes';
    return `${hours} ${hourText}, ${minutes} ${minuteText} ago`;
  } else {
    const days = Math.floor(diff / DAY);
    const hours = Math.floor((diff % DAY) / HOUR);
    const dayText = days === 1 ? 'day' : 'days';
    const hourText = hours === 1 ? 'hour' : 'hours';
    return `${days} ${dayText}, ${hours} ${hourText} ago`;
  }
};

组件中使用

直接在React组件里调用函数传入日期字符串即可:

function Comment({ createTime, content }) {
  return (
    <div className="comment-item">
      <p className="comment-content">{content}</p>
      <span className="comment-time">{formatRelativeTime(createTime)}</span>
    </div>
  )
}

// 测试:传入 "June 10, 2022, 3:29 PM" 会自动按规则计算输出对应相对时间

如果需要实现时间自动刷新,只需要在组件挂载时开启1分钟间隔的定时器,定时更新当前时间触发重渲染即可。

基于dayjs的轻量实现

如果项目中已经使用dayjs做日期处理,可以直接搭配其官方的relativeTime插件实现,不需要自己写差值计算逻辑:

import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(relativeTime);

// 直接调用即可,可通过插件配置自定义输出阈值匹配格式要求
const formatRelativeTime = (dateInput) => dayjs(dateInput).fromNow();

dayjs整体体积只有2KB左右,不会给项目带来明显的包体积负担。

注意:拿到的June 10, 2022, 3:29 PM属于ECMAScript标准支持的日期格式,原生Date和主流日期库都可以直接解析,不需要额外做格式转换。如果后续遇到非标准日期格式,再单独加解析逻辑即可。

内容的提问来源于stack exchange,提问作者Wandi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:54:23