1

在一个网站上(http://webdesign.onyou.ch/2010/08/04/javascript-time-ago-pretty-date/)我发现这个非常有用的功能,你给它一个 ISO 8601 时间(例如 2010- 08-26T22:24:17Z) 并输出自此时间戳以来经过的时间。但是因为我想使用UTC ISO 8601时间戳,所以我的应用程序可以在国际上使用,例如,如果你在欧洲,它总是说“3小时前”,即使消息已经在几秒钟前发布.

那么如何让它返回自输入 UTC 时间戳和当前 UTC 时间以来已经过去了多少时间?

    function relativeTime(date_str){
    var time_formats = [
    [60, 'seconds', 1], // 60
    [120, '1 minute ago', '1 minute from now'], // 60*2
    [3600, 'minutes', 60], // 60*60, 60
    [7200, '1 hour ago', '1 hour from now'], // 60*60*2
    [86400, 'hours', 3600], // 60*60*24, 60*60
    [172800, 'yesterday', 'tomorrow'], // 60*60*24*2
    [604800, 'days', 86400], // 60*60*24*7, 60*60*24
    [1209600, 'last week', 'next week'], // 60*60*24*7*4*2
    [2419200, 'weeks', 604800], // 60*60*24*7*4, 60*60*24*7
    [4838400, 'last month', 'next month'], // 60*60*24*7*4*2
    [29030400, 'months', 2419200], // 60*60*24*7*4*12, 60*60*24*7*4
    [58060800, 'last year', 'next year'], // 60*60*24*7*4*12*2
    [2903040000, 'years', 29030400], // 60*60*24*7*4*12*100, 60*60*24*7*4*12
    [5806080000, 'last century', 'next century'], // 60*60*24*7*4*12*100*2
    [58060800000, 'centuries', 2903040000] // 60*60*24*7*4*12*100*20, 60*60*24*7*4*12*100
    ];
    var time = ('' + date_str).replace(/-/g,"/").replace(/[TZ]/g," ").replace(/^\s\s*/, '').replace(/\s\s*$/, '');
    if(time.substr(time.length-4,1)==".") time =time.substr(0,time.length-4);
    var seconds = (new Date - new Date(time)) / 1000;
    var token = 'ago', list_choice = 1;
    if (seconds < 0) {
        seconds = Math.abs(seconds);
        token = 'from now';
        list_choice = 2;
    }
    var i = 0, format;
    while (format = time_formats[i++])
        if (seconds < format[0]) {
            if (typeof format[2] == 'string')
                return format[list_choice];
            else
                return Math.floor(seconds / format[2]) + ' ' + format[1] + ' ' + token;
        }
    return time;
}
4

2 回答 2

1
var now = new Date(); 
var utcNow = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),  now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());

然后utcNow在你当前使用的地方使用new Date().

于 2012-08-28T08:57:52.930 回答
1

改变

var seconds = (new Date - new Date(time)) / 1000;

var seconds = (new Date - new Date(time)) / 1000 + (new Date).getTimezoneOffset()*60;

在发布之前我没有测试你的代码,所以这里是文档getTimezoneOffsethttps ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset

于 2012-08-28T09:02:27.133 回答