2

私のウェブサイトには、コメントが投稿されてからどれくらい経ったかを示すコメントフォームがあります。以下は、コメントdiv
全体 ではなく、10 秒ごとに日付を含むスパンのみをリロードするコードです(ページラグを防ぐため)。

$(function(){
     setInterval(
     function(){ 
     var id = $('.date').html();
     $('.date').load('/comdate.php?id=' + id); }
     ,10000);
});

私の関数は機能していません。コメントの日付フィールドごとに個別の関数を作成したくありません。誰かが私の問題を指摘してください。ありがとう

EDIT
これをjavascriptで使用して、時間を読み取り可能な日付に変更しています

   function prettyDate(time){
    var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ")),
        diff = (((new Date()).getTime() - date.getTime()) / 1000),
        day_diff = Math.floor(diff / 86400);

    if ( isNaN(day_diff) || day_diff < 0 || day_diff >= 31 )
        return;

    return day_diff == 0 && (
            diff < 60 && "just now" ||
            diff < 120 && "1 minute ago" ||
            diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
            diff < 7200 && "1 hour ago" ||
            diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
        day_diff == 1 && "Yesterday" ||
        day_diff < 7 && day_diff + " days ago" ||
        day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago";
}

// If jQuery is included in the page, adds a jQuery plugin to handle it as well
if ( typeof jQuery != "undefined" )
    jQuery.fn.prettyDate = function(){
        return this.each(function(){
            var date = prettyDate(this.title);
            if ( date )
                jQuery(this).text( date );
        });
    };

これは GMT+1 を返しますが、それは私がいる場所だからです。この関数を変更して、javascript タイムゾーンも GMT にする方法を教えてください。

4

3 に答える 3

4

私にとっては、ajax リクエストを変更して UNIX タイムスパンを 1 回だけ送信し、すべての計算を JavaScript で行います。

var periods = ["second", "minute", "hour", "day", "week", "month", "year", "decade"];
var lengths = ["60","60","24","7","4.35","12","10"];

function nicetime(user_date)
{
    if(typeof user_date == "undefined" ) {
        return "No date provided";
    }

    var now  = new Date().getTime();
    var unix_date = user_date;

    // check validity of date
    if(unix_date == "") {   
        return "Bad date";
    }

    // is it future date or past date
    if(now > unix_date) {   
        var difference = now - unix_date;
        var tense = "ago";
    } else {
        var difference = unix_date - now;
        var tense      = "from now";
    }
    difference = difference/1000; //from milliseconds to seconds;
    for(var j = 0; difference >= lengths[j] && j < lengths.length-1; j++) {
        difference /= lengths[j];
    }

    difference = Math.round(difference);

    if(difference != 1) {
        periods[j] += "s";
    }

   return difference+" "+periods[j]+" "+tense;
}


console.log(nicetime(1378632182334));

例:

http://jsfiddle.net/F6H2w/

私があなたの機能で変更した唯一のものは次のとおりです。

difference = difference/1000; //from milliseconds to seconds;

あなたのコードは、ミリ秒単位で差分変数を処理していましたが、これは秒単位である必要があります。

于 2013-09-08T09:34:41.797 に答える
2

@ra_htial が最初のコメントで行った提案は、クライアント側で JavaScript を使用して管理できる要求でサーバーを不必要にポーリングしないため、最良の提案のように思えます。したがって、私の提案はdata-date、スパン要素に属性を追加することです.date。これには、日付と時刻がプレーン形式で含まれ、javascript でデコードして、人間が読める日付を更新するために使用できます。

静的データを使用した html は次のようになります。

<span class="date" data-date="2013-09-08 12:37">1 min ago</span>

またはあなたのphpスクリプトから出力されます:

<span class="date" data-date="<?php echo $date; ?>"><?php echo nicetime($date); ?></span>

そして、ここに日付の内容を更新する JavaScript があります (この記事http://www.zachleat.com/web/yet-another-pretty-date-javascript/の書式設定機能を使用しましたが、John Resig のPretty Dateのような他の代替手段があります):

setInterval(function()
{ 
    $('.date').each(function()
    {
        var $this = $(this);
        $this.html(humane_date($this.data('date')));
    });
}, 10000);

編集

これは、機能を説明するフィドルですhttp://jsfiddle.net/FXERS/data-dateフィドルの要素の 1 つの属性を現在の時刻に変更して、更新を確認する必要があります。

于 2013-09-08T09:41:57.453 に答える