使用jquery / javascript每分钟更新时间描述

时间:2013-06-26 16:09:22

标签: javascript jquery unix-timestamp

我创建了以下代码来每分钟更新所有跨度的文本内容。页面上有许多这些跨度都需要每分钟更新一次:

<span data-unix="1372263005" class="time_ago">4 minutes ago</span>

代码如下:

window.setInterval(function(){
    $(".time_ago").each(function(i, elem) { 
        var unix = $(elem).attr("data-unix")
        var now = new Date().getTime();
        now = parseInt(now) / 1000;
        var amount = 0;
        var difference = 0;

        difference = parseInt(now) - parseInt(unix);

        if (difference < 60)
        {
            $(elem).html('a few seconds ago');
        }
        else if (difference < 120)
        {
            $(elem).html('a minute ago');
        }
        else if (difference < 3600)
        {
            amount = Math.floor(difference / 60);
            $(elem).html(amount + ' minutes ago');
        }
        else if (difference < 7200)
        {
            $(elem).html('an hour ago');
        }
        else if (difference < 86400)
        {
            amount = Math.floor(difference / 3600);
            $(elem).html(amount + ' hours ago');
        }
        else if (difference < 172800)
        {
            $(elem).html('a day ago');
        }
        else if (difference < 2635200)
        {
            amount = Math.floor(difference / 86400);
            $(elem).html(amount + ' days ago');
        }
        else if (difference < 5270400)
        {
            $(elem).html('a month ago');
        }
        else if (difference < 31622400)
        {
            amount = Math.floor(difference / 2635200);
            $(elem).html(amount + ' months ago');
        }
        else if (difference < 63244800)
        {
            $(elem).html('a year ago');
        }
        else
        {
            amount = Math.floor(difference / 31622400);
            $(elem).html(amount + ' years ago');
        }
    });
    return false;
}, 60);

EDIT1)好的,现在我已经对你的建议做了一些修改,但它正在将范围文本改为43351年。任何想法为什么这样做?

EDIT2)好的,现在我有/ 1000,所以php unix时间与js getTime()匹配。唯一的问题是现在它将它应用于所有值。 ie)对于.time_ago的所有实例,我得到31分钟 - 我如何让它一次只应用于一个,所以每个实例得到不同的时间?

EDIT3)添加了正确的代码,以防有人发现它有用..

2 个答案:

答案 0 :(得分:2)

您遇到此错误,因为 floor()不是JS中的函数。

每次使用

floor() 

使用

Math.floor()

代替。

答案 1 :(得分:2)

floor()Math对象上的一个函数,因此要调用它,您需要使用Math.floor()

您可以考虑在每个if / else块中设置一条消息,并在函数末尾设置一次。这样,如果您需要更改任何类或属性,您只需要在一个地方进行。

其他一些注意事项:使用html()代替text()设置HTML内容;你应该在使用parseInt()时使用基数,否则任何带前导0的东西都会被解析为八进制数,而不是十进制数。

您需要使用以unix开头的HTML5约定设置data-属性,然后您可以使用jQuery的data()attr()函数来检索值。如果使用data()函数,jQuery会将值转换为整数。

window.setInterval(function(){
    var unix = $(".time_ago").data('unix');
    var now = new Date().getTime();
    var amount = 0;
    var difference = now - unix;
    var message = "";

    if (difference < 60)
    {
        message = 'a few seconds ago';
    }
    else if (difference < 120) {
        message = 'a minute ago';
    }
    ...

    //just do this once
    $(".time_ago").html('<span data-unix="' + unix + '" class="time_ago">' + message + '</span>');
    return false;
}, 60);