1

これが私の目標です。特定の日付がかなり読みやすい文字列としてどれくらい前にあったかを取得したいと思います。「4日前と3時間前」のようなもの。私はdatejsを使用しており、現在両方の日付をエポックとして使用しています。

あるエポックを他のエポックから減算し、その差を取り、出力する文字列を手動で計算できることはわかっています。しかし、これはdatejsが処理するもののように感じます。ただし、日付オブジェクトまたはエポックを時間の量に変換する手段を表現している(そのことに関するjs libの)ドキュメントはありません。

これをどのように処理するのが最善かについてのアイデアはありますか?

アップデート

もっとはっきりさせておきます。私が人間が読めると言うとき、それは意味します

  • 1日前は「昨日」です
  • 2日前は「2日前」です
  • 30秒前は「今」です
  • 1年3日12秒前は「1年前」です

私がやったこと

    prettyAgo = (ago) ->
        ago = ago.getTime() if typeof ago is 'object'
        diff = ((new Date()).getTime() - ago) / 1000
        dayDiff = Math.floor(diff / 86400)
        return false if isNaN(dayDiff) or dayDiff < 0

        writer = ''

        if dayDiff is 0
            if diff < 1 then writer             = 'just now'
            else if diff < 60 then writer       = Math.floor(diff)+' seconds ago'
            else if diff < 120 then writer      = '1 minute ago'
            else if diff < 3600 then writer     = Math.floor(diff / 60)+' minutes ago'
            else if diff < 7200 then writer     = '1 hour ago'
            else if diff < 86400 then writer    = Math.floor(diff / 3600)+' hours ago'
        else if dayDiff is 1 then writer        = 'yesterday'
        else if dayDiff < 7 then writer         = dayDiff+' days ago'
        else if dayDiff is 7 then writer        = '1 week ago'
        else if dayDiff < 31 then writer        = Math.ceil( dayDiff / 7 )+' weeks ago'
        else writer                             = new Date(ago).toString 'MMM yyyy'

        return writer
4

2 に答える 2

2

DateJSは、計算を行うTimeSpan(ベースJSファイルではなくtime.jsで定義されている)と呼ばれるクラスを含めることでこれを処理します。フォーマットは行わないため、次のようなものが必要になります。

function showDiff(date1, date2) {
    var diff, rv, yrs;

    diff = new TimeSpan(date2 - date1);
    if (diff.days > 0) {
        // A day or more difference
        if (diff.days === 1) {
            rv = "yesterday";
        }
        else if (diff.days >= 365) {
            yrs = diff.days / 365;
            if (yrs === 1) {
                rv = "1 year ago";
            }
            else {
                rv = yrs + " years ago";
            }
        }
        else {
            rv = diff.days + " ago";
        }
    }
    else {
        // Less than 1 day difference
        if (diff.hours > 0) {
            if (diff.hours === 1) {
                rv = "1 hour ago";
            }
            else {
                rv = diff.hours + " hours ago";
            }
        }
        else if (diff.minutes > 0) {
            if (diff.minutes === 1) {
                rv = "1 minute ago";
            }
            else {
                rv = diff.minutes + " minutes ago";
            }
        }
        else {
            rv = "just now";
        }

        return rv;
    }

明らかに、これは完璧ではなく、うるう年などを処理しませんが、それはあなたにアイデアを与えるはずです。

于 2012-06-26T22:12:56.117 に答える
1

実際には、純粋なJavaScriptでそれを行うことができます。

function format(num) {
    var date = new Date(num),
        time = [];
    with(time) {
        push(date.getUTCDate() - 1);
        push(date.getUTCHours());
        push(date.getUTCMinutes());
        push(date.getUTCSeconds());
    }
    if (time[0] > 29) {
        time[0] = Math.floor(date / 86400000);
    }
    return time[0] + " day " + time[1] + " hours " + time[2] + " mintues " + time[3] + " seconds ago";
}

http://jsfiddle.net/DerekL/NqTnF/

于 2012-06-26T22:13:54.590 に答える