【问题标题】:Moment.js from now / today in Days, Months & Years Ago [duplicate]Moment.js 从现在/今天在几天、几个月和几年前 [重复]
【发布时间】:2021-06-28 19:10:17
【问题描述】:

我正在使用 moment.js 来显示从“今天”到发布帖子的时间,对于任何具有原始 ISO 日期“.iso-date”的帖子,然后输出从div '.display-date' 中的帖子。我有一个可以正常工作的脚本,但它只显示“年”,如果帖子是今天,那么它什么也不输出。同样,它只显示前 12 个月后的几个月和几年,因此是 1-11 个月,然后只显示 x 年前。

当前输出“3 个月前发布”、“一年前发布”、“e 年前发布”等

所以我想看到类似“刚刚发布”、“今天发布”、“6 天前发布”、“3 周、5 天前发布”、9 个月、3 周、5 天前发布' 和 '在 3 年 9 个月 3 周 5 天前发布' - 或者只是'最近的日期间隔'。

标记示例

<div class="posts-list">

<div class="grid-block">
<div class="iso-date">2019-09-30</div>
<div class="display-date"></div>
</div>

<div class="grid-block">
<div class="iso-date">2020-07-12</div>
<div class="display-date"></div>
</div>

</div>

这是当前脚本:-

// Moment 
$(document).ready(function () {

// Moment targets
  var publishedDate = ".iso-date";
  var displayDate = ".display-date";
  
  $(publishedDate).each(function (i, e) {
  
    var p = $(e).text();
    var a = $(e).next(displayDate);
    
    if (moment(p).isValid()) {
    
   var m = moment(new Date(p));
   var s = moment(new Date(m)).fromNow();
    // var s = moment(new Date(m)).diff(moment(), 'milliseconds');  

      a.text("Posted " + s);
    }

  });

});

我希望您能就如何使用 Moment.js r 实现这一点提供意见,或许无需任何脚本依赖 - jQuery / JavaScript。

谢谢

格伦尼男孩

【问题讨论】:

标签: javascript jquery date momentjs


【解决方案1】:

检查下面的 sn-ps。我从这里使用了这个answer,并根据您的要求实现了它。

function dateAgo(date) {  

    var startDate = new Date( date + " " + '12:00 AM');
    var endDate = new Date();

    var diffDate  = new Date(new Date() - startDate);

    var yearDiff  = diffDate.toISOString().slice(0, 4) - 1970;
    var monthDiff = diffDate.getMonth(); 
    var dayDiff   = diffDate.getDate()-1;

    var msec  = endDate - startDate;
    var mins  = Math.floor(msec / 60000);
    var hrs   = Math.floor(mins / 60);
    var days  = Math.floor(hrs / 24);
      
    var label = 'Posted ';
    if( mins <= 30 ){
        label += ' Just Now';
    }else if( hrs <= 24 ){
        label += ' Just Today';
    }else{
        if( yearDiff > 0  ){
            label += ( yearDiff > 1 ) ? yearDiff+' years, ' : yearDiff+' year, ';
        }

        if( monthDiff > 0 ){
            label += ( monthDiff > 1 ) ? monthDiff+' months, ' : monthDiff+' month, ';
        }

        if( dayDiff > 0 ){
            label += ( dayDiff > 1 ) ? dayDiff+' days ' : dayDiff+' day ';
        }

        label += 'ago';
    }
  
    return label;   
    
}

(function() {
    var elements = document.body.getElementsByClassName('iso-date');
    for (var i = 0; i < elements.length; i++) {
        var date  = elements[i].innerHTML;
        var label = dateAgo(date);
        elements[i].nextElementSibling.innerHTML = label;   
    }
})();
<div class="grid-block">
<div class="iso-date">2019-09-30</div>
<div class="display-date"></div>
</div>

<div class="grid-block">
<div class="iso-date">2021-04-06</div>
<div class="display-date"></div>
</div>

【讨论】:

  • 嗨@Bhautik 感谢您的原始回答,我很欣赏它更好,因为它不使用外部库。这适用于单个帖子页面,但不适用于循环帖子,我意识到这在我的示例中并不明显。那么我如何让它适用于父'.posts-list'中的'grid-block'的'每个'实例?所以实际上完整(更新的)标记是:-
    2019-09-30
    2019-09-30
    您能否将 HTML 放入您的问题中并提供预期的输出。
  • 抱歉,擦掉上面的内容。它现在似乎正在工作。唯一的事情......任何改变单日,月,年输出的方法。因此,例如,不是“1 天前发布”而是“1 天前发布”,类似 1 个月前发布等等。谢谢
  • 太好了,有什么方法可以删除前导 ',' 1 天“发布于 1 天前”?
  • 抱歉耽搁了,这里是假期 :-) 我刚刚进行了一次测试,现在还不是很划算。我刚刚发布,上面写着“发布前”。我认为还有一个模式可以说“刚刚发布”+“今天发布”——这可以实现吗?谢谢
猜你喜欢
相关资源
最近更新 更多
热门标签