使用javascript定期更新发布评论的时间

使用javascript定期更新发布评论的时间,javascript,jquery,formatting,setinterval,Javascript,Jquery,Formatting,Setinterval,我想定期更新在我的网站上发表的评论的时间。我感兴趣的格式,就像Facebook和其他网站所做的那样,帖子的时间是相对于当前时间列出的。例如,文章在第一次提交时应该说“刚刚……”,但在1分钟后应该说“1分钟前”,然后是“2分钟前”,依此类推 我发现这是一个很好的脚本: 我已经走了一半了 到目前为止,我的代码存在两个问题: 报道的时间被搞砸了 即使setinterval()工作正常,时间也不会每秒更新一次 下面是一段代码,我将其全部放在JSFIDLE中:。我认为问题在于var-time $(docu

我想定期更新在我的网站上发表的评论的时间。我感兴趣的格式,就像Facebook和其他网站所做的那样,帖子的时间是相对于当前时间列出的。例如,文章在第一次提交时应该说“刚刚……”,但在1分钟后应该说“1分钟前”,然后是“2分钟前”,依此类推

我发现这是一个很好的脚本: 我已经走了一半了

到目前为止,我的代码存在两个问题:

  • 报道的时间被搞砸了
  • 即使
    setinterval()
    工作正常,时间也不会每秒更新一次
  • 下面是一段代码,我将其全部放在JSFIDLE中:。我认为问题在于
    var-time

    $(document.body).on('click', 'button', function(){
    var id= $(this).data('id'),
    comment=$('textarea[data-id="'+id+'"]').val(),
    start_timer = setInterval(function() { 
        var time =  new Date();
        time = time_since(time);
    
        $('div[data-id="'+id+'"]').html(time);
    
        }, 
        1000);
        $('#'+id).html(comment); 
    });
    
    我已经测试过了,而且:

    $(document.body).on('click','button',function()){
    var id=$(this).data('id'),
    comment=$('textarea[data id=“”+id+“]”)val();
    变量时间=新日期();
    启动计时器=设置间隔(函数(){
    //变量时间=新日期();
    var time2=自(time.getTime()/1000)起的时间;
    $('div[data id=“”+id+“]”)html(time2);
    },
    1000);
    $('#'+id).html(注释);
    });
    /**
    *日期后缀()
    *返回一个月中给定日期的日期后缀(st、nd、rd、th)
    *
    *@作者:安迪·托马斯(forrst@antom.co.uk)
    *@日期:27/09/2010
    */
    函数日期\后缀(日期){
    如果(日期=1 | |日期=21 | |日期=31){
    返回“st”;
    }否则如果(日期==2 | |日期==22){
    返回“nd”;
    }否则,如果(日期==3 | |日期==23){
    返回“rd”;
    }否则{
    返回“th”;
    }
    }
    /**
    *自()以来的时间
    *返回自给定unix_时间戳以来经过的时间。
    *10秒前、1小时前、9月10日等
    *
    *@作者:安迪·托马斯(forrst@antom.co.uk)
    *@日期:27/09/2010
    */
    功能时间\u自(原始){
    原件=新日期(原件*1000);
    var-str='';
    风险值月份=[
    “一月”,
    二月,,
    “三月”,
    “四月”,
    “五月”,
    "六月",,
    七月,,
    "八月",,
    "九月",,
    “十月”,
    十一月,,
    “十二月”
    ];
    变量块=[
    [31536000000,‘年’,
    [2592000000,‘月’],
    [604800000,‘一周’,
    [86400000,‘天’],
    [3600000,‘小时’],
    [60000,‘分钟’],
    [1000,'秒'],
    ];
    var today=新日期();
    var-since=新日期(今天.getTime()-original.getTime());
    如果(自.getTime()以来>604800000){
    str=months[original.getMonth()]+''+original.getDate()+日期后缀(original.getDate());
    如果(自.getTime()以来>31536000000){
    str=str+','+original.getFullYear();
    }
    返回str;
    }
    var-ms=0;
    var name=0;
    var i=0;
    var ic=chunks.length;
    var计数=0;
    
    对于(i=0;这很有帮助,现在它永久性地表示“0秒前”。但是您能解释一下为什么
    $('div[data id=“'+id+'']”)html(time);
    不是每秒钟更新一次吗?你好,Marian,谢谢你,但问题是它没有更新
    。对此有什么解决办法吗?最简单的方法是检查/更新JSFIDLE:谢谢你的回答,看起来关键是要在
    设置间隔()之外定义
    新日期
    功能。我认为每10秒或15秒更新一次更好,因为每秒检查时间是没有用的,用户不关心“1分钟前”是否真的是1分钟(如果每10秒检查一次时间,则是“1分钟到1分钟加10秒前”)。我不知道,它也对我有用。@boudou抱歉,我说错了。忘了我说的话。让我们回到开头。它很有效。谢谢你关于减少更新频率的建议。是的,在我的实际应用程序中,我会这样做。我写了一条评论,点击了一次按钮,它每秒钟都会更新,所以我不明白发生了什么错。
    $(document.body).on('click', 'button', function(){
        var id= $(this).data('id'),
        comment=$('textarea[data-id="'+id+'"]').val();
        var time =  new Date();
        start_timer = setInterval(function() {
    
            //var time =  new Date();
            var time2 = time_since(time.getTime()/1000);
    
            $('div[data-id="'+id+'"]').html(time2);
    
            },
            1000);
            $('#'+id).html(comment);
    });
    
    
    /**
     * date_suffix()
     * returns the date suffix (st,nd,rd,th) for a given day in a month
     *
     * @author: Andy Thomas (forrst@antom.co.uk)
     * @date: 27/09/2010
     */
    
    function date_suffix(date) {
            if (date == 1 ||  date == 21 || date == 31) {
                    return 'st';
            } else if (date == 2 || date == 22) {
                    return 'nd';
            } else if (date == 3 || date == 23) {
                    return 'rd';
            } else {
                    return 'th';
            }
    }
    
    /**
     * time_since()
     * returns the time passed since a given unix_timestamp.
     * eg. 10 seconds ago, 1 hour ago, 10th Sep etc
     *
     * @author: Andy Thomas (forrst@antom.co.uk)
     * @date: 27/09/2010
     */
    function time_since(original) {
            original = new Date(original * 1000);
    
            var str = '';
    
            var months = [
                    'Jan',
                    'Feb',
                    'Mar',
                    'Apr',
                    'May',
                    'Jun',
                    'Jul',
                    'Aug',
                    'Sep',
                    'Oct',
                    'Nov',
                    'Dec'
            ];
    
            var chunks = [
                    [31536000000, 'year'],
                    [2592000000, 'month'],
                    [604800000, 'week'],
                    [86400000, 'day'],
                    [3600000, 'hour'],
                    [60000, 'minute'],
                    [1000, 'second'],
            ];
    
            var today = new Date();
            var since = new Date(today.getTime() - original.getTime());
    
            if (since.getTime() > 604800000) {
                    str = months[original.getMonth()] + ' ' + original.getDate() + date_suffix(original.getDate());
    
                    if (since.getTime() > 31536000000) {
                            str = str + ', ' + original.getFullYear();
                    }
    
                    return str;
            }
    
            var ms = 0;
            var name = 0;
            var i = 0;
            var ic = chunks.length;
            var count = 0;
    
            for (i=0;i<ic;i++) {
                    ms = chunks[i][0];
                    name = chunks[i][1];
    
                    count = Math.floor(since.getTime() / ms);
    
                    if (count != 0) {
                            break;
                    }
            }
    
            return count + ' ' + name + ((count == 1) ? '' : 's') + ' ago';
    }