【问题标题】:Jquery Timeago NaN Years ago from .attrJquery Timeago NaN 多年前来自 .attr
【发布时间】:2026-01-27 06:00:01
【问题描述】:

首先,经过一段时间的斗争,我终于发布了。

基本上,我正在使用 Socket.IO 为我正在工作的网站创建一个信使。我的 timeago 插件在几年前显示 NaN 作为其输出时遇到问题。

在谷歌搜索之后,我发现 timeago 插件需要一个非常具体的日期格式,或者一个 Java Date() 对象。

这是我的代码..

socket.on('chat.message', function (data) {
  data = JSON.parse(data);
  if (data.hasOwnProperty('system')) {
    toastr["success"](data.msg);
  } else {
    $chat.append(
      '<li class="left clearfix">' +
      '<span class="chat-img pull-left">' +
      '<img src="https://www.gravatar.com/avatar/?d=mm&amp;s=40" alt="User Avatar" class="img-circle" width="50" />' +
      '</span>' +

      '<div class="chat-body clearfix">' +
      '<div class="header">' +
      '<strong class="primary-font">' + data.nickname + '</strong>' +
      '<small class="pull-right text-muted time" data-time="' + data.timeSent + '">' +
      '<span class="glyphicon glyphicon-time"></span>' + $.timeago(data.timeSent) +
      '</small>' +
      '</div>' +
      '<p>' + data.msg + '</p>' +
      '</div>' +
      '</li>'
    );
    $('.panel-body').animate({scrollTop: $chat.height()});
  }
});

function updateTimes() {
  $('.time').each(function () {
    var time = $.timeago($(this).attr('data-time'));
    $(this).html(time);
  });
}
setInterval(function () {
  updateTimes();
}, 3000);

如您所见,附加到页面上的每个消息元素都有 timeago 输出,发送的原始时间存储在一个属性中,供我的函数使用 updateTimes() 更新。

当第一次收到消息时,一切都很好。但是,当我使用属性的值并将其传递给 timeago 时,这就是一切出错的地方。

通过搜索,我认为我可以执行以下操作:

function updateTimes() {
  $('.time').each(function() {
    var time = new Date($(this).attr('data-time'));
    $(this).html($.timeago(time));
  });
}

虽然这也不起作用。

....编辑....

一开始我忘了说我是如何设置时间的..

var d = new Date();
var time = d.getTime();

希望这对某人来说是显而易见的,不幸的是我缺乏 JavaScript 知识!

非常感谢任何帮助。

好的,现在这个问题已经解决了。

看来你不能传递 Date() 一个字符串,所以我不得不

var time = new Date(parseInt($(this).attr('data-time')));

非常感谢@amklose

【问题讨论】:

  • 在您的updateTimes 函数中,如果将$(this).attr('data-time') 替换为"2008-07-17" 等实际日期字符串,它是否正确输出?如果是这样,试试这个,看看打印到控制台的内容。我感觉您的日期对象的格式可能不正确。 var time = new Date($(this).attr('data-time')); console.log(time);
  • function updateTimes() { $('.time').each(function() { console.log($.timeago(new Date("2008-07-17"))); }); } 显示...“7 年前”
  • 抱歉,我一开始没有提到我是如何设置时间的,我已经更新了我的问题以显示这个......
  • 这很好,那么当你在那个备用 updateTimes() 函数中console.log(time); 时会发生什么?
  • @amklose - “无效日期” - 如上所述,它是我使用的时间戳,而不是日期

标签: javascript jquery socket.io timeago


【解决方案1】:

好的,现在这个问题已经解决了。

看来你不能传递 Date() 一个字符串,所以我不得不

var time = new Date(parseInt($(this).attr('data-time')));

非常感谢@amklose

【讨论】: