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

家庭实验室状态页项目:实现发布时长计算需求

解决状态更新发布时长计算的方案

Hey Josh, 刚好我之前做过类似的家庭实验室状态页功能,用你熟悉的moment.js就能轻松搞定,甚至还可以用原生JS实现(不用额外依赖库),下面给你详细讲两种方案:

方案一:用moment.js快速实现(推荐,因为你已经熟悉它)

1. 确保项目已安装moment.js

如果还没安装,在项目根目录跑命令:

npm install moment

2. 后端路由传递发布时间到EJS

在你的展示路由里,把状态更新的发布时间(比如从数据库拿到的createdAt字段)一起传给EJS模板:

// SHOW STATUS ROUTE CODE 示例(根据你的实际代码调整)
app.get('/status/:id', async (req, res) => {
  // 假设你从数据库获取状态数据,这里用模拟数据示例
  const status = await Status.findById(req.params.id); 
  res.render('status/show', { status }); // 把状态对象传给模板
});

3. EJS模板中计算并展示相对时间

在你的EJS展示模板里,直接调用moment的fromNow()方法,它会自动计算发布时间到当前服务器时间的相对时长:

<!-- status/show.ejs 模板代码片段 -->
<div class="status-card">
  <h2><%= status.title %></h2>
  <div class="meta">
    <!-- 这里就是核心:自动生成"2小时前"、"3天前"这类相对时间 -->
    <span>发布于:<%= moment(status.createdAt).fromNow() %></span>
  </div>
  <p><%= status.content %></p>
</div>

fromNow()方法会智能处理不同时间跨度,比如几秒前显示"刚刚",几小时前显示"X小时前",完全符合状态页的需求。

方案二:原生JS实现(无需依赖库)

如果你不想额外引入moment.js,用ES6+的Intl.RelativeTimeFormat API也能实现,步骤如下:

1. 后端添加相对时间计算函数

在你的展示路由里,先写一个计算相对时间的工具函数,处理好时间差后传给EJS:

// SHOW STATUS ROUTE CODE 中添加工具函数
const getRelativeTime = (publishDate) => {
  const now = new Date();
  const diffMs = now - new Date(publishDate);
  const diffSeconds = Math.floor(diffMs / 1000);

  // 定义时间单位和对应的秒数
  const timeUnits = [
    { unit: 'year', seconds: 31536000 },
    { unit: 'month', seconds: 2592000 },
    { unit: 'day', seconds: 86400 },
    { unit: 'hour', seconds: 3600 },
    { unit: 'minute', seconds: 60 },
    { unit: 'second', seconds: 1 }
  ];

  // 遍历找到最合适的时间单位
  for (const { unit, seconds } of timeUnits) {
    const value = Math.floor(diffSeconds / seconds);
    if (value !== 0) {
      return new Intl.RelativeTimeFormat('zh-CN', { style: 'long' }).format(-value, unit);
    }
  }
  return '刚刚';
};

// 路由逻辑
app.get('/status/:id', async (req, res) => {
  const status = await Status.findById(req.params.id);
  status.relativePublishTime = getRelativeTime(status.createdAt); // 计算好相对时间
  res.render('status/show', { status });
});

2. EJS模板直接展示计算好的时间

<!-- status/show.ejs 模板代码片段 -->
<div class="status-card">
  <h2><%= status.title %></h2>
  <div class="meta">
    <span>发布于:<%= status.relativePublishTime %></span>
  </div>
  <p><%= status.content %></p>
</div>

注意事项

  • 确保你的status.createdAt是有效的日期格式(比如ISO字符串"2024-05-20T12:30:00Z"或者Date对象),moment.js和原生JS都能直接解析。
  • 如果是在前端浏览器中渲染(而非后端EJS渲染),要确保moment.js被引入到前端页面(比如通过CDN或打包工具)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:06:29