首页 > 解决方案 > 使用 setInterval 方法时 MomentJS 不起作用

问题描述

我正在使用 moment.js 将时间戳转换为可读形式,例如“8 分钟前”!

我正在使用 setInterval 每 1 秒更新一次代码以动态更新时间,但它根本不起作用。帮我!

代码:

let timer = () => {
  let time = document.getElementsByClassName('timeago');

  for(let i = 0; i < time.length; i++) {
    time[i].innerText = moment(time[i].innerText, "YYYY-MM-DD h:mm:ss").tz("Asia/Kathmandu").fromNow();
  }
};
setInterval(timer, 1000);
<span class="timeago">2018-05-15 09:21:00</span>

<script src="https://momentjs.com/downloads/moment.min.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>

标签: javascriptmomentjs

解决方案


moment每次函数运行时,您都将元素的文本解析为字符串(并告诉根据“YYYY-MM-DD h:mm:ss”来解释它)。取而代之的是,只保存该时刻一次,并在一段时间内计算它与现在之间的差异。

您还需要让 Moment 正确格式化它。您的元素具有09:21:00但 Moment 格式字符串是h:mm:ss- 在两位数小时的情况下将不起作用。

const timeagoSpan = document.querySelector('.timeago');
const from = moment(timeagoSpan.textContent, "YYYY-MM-DD hh:mm:ss");
let timer = () => {
  timeagoSpan.textContent = from.fromNow();
};
timer();
setInterval(timer, 1000);
<span class="timeago">2018-05-14 22:21:00</span>

<script src="https://momentjs.com/downloads/moment.min.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>


推荐阅读