How to format time since xxx e.g. “4 minutes ago” similar to Stack Exchange sites

后端 未结 25 1975
遥遥无期
遥遥无期 2020-11-22 12:57

The question is how to format a JavaScript Date as a string stating the time elapsed similar to the way you see times displayed on Stack Overflow.

e.g.<

25条回答
  •  一向
    一向 (楼主)
    2020-11-22 13:29

    My solution..

    (function(global){
                const SECOND   = 1;
                const MINUTE   = 60;
                const HOUR     = 3600;
                const DAY      = 86400;
                const MONTH    = 2629746;
                const YEAR     = 31556952;
                const DECADE   = 315569520;
    
                global.timeAgo = function(date){
                    var now = new Date();
                    var diff = Math.round(( now - date ) / 1000);
    
                    var unit = '';
                    var num = 0;
                    var plural = false;
    
                    switch(true){
                        case diff <= 0:
                            return 'just now';
                        break;
    
                        case diff < MINUTE:
                            num = Math.round(diff / SECOND);
                            unit = 'sec';
                            plural = num > 1;
                        break;
    
                        case diff < HOUR:
                            num = Math.round(diff / MINUTE);
                            unit = 'min';
                            plural = num > 1;
                        break;
    
                        case diff < DAY:
                            num = Math.round(diff / HOUR);
                            unit = 'hour';
                            plural = num > 1;
                        break;
    
                        case diff < MONTH:
                            num = Math.round(diff / DAY);
                            unit = 'day';
                            plural = num > 1;
                        break;
    
                        case diff < YEAR:
                            num = Math.round(diff / MONTH);
                            unit = 'month';
                            plural = num > 1;
                        break;
    
                        case diff < DECADE:
                            num = Math.round(diff / YEAR);
                            unit = 'year';
                            plural = num > 1;
                        break;
    
                        default:
                            num = Math.round(diff / YEAR);
                            unit = 'year';
                            plural = num > 1;
                    }
    
                    var str = '';
                    if(num){
                        str += `${num} `;
                    }
    
                    str += `${unit}`;
    
                    if(plural){
                        str += 's';
                    }
    
                    str += ' ago';
    
                    return str;
                }
            })(window);
    
            console.log(timeAgo(new Date()));
            console.log(timeAgo(new Date('Jun 03 2018 15:12:19 GMT+0300 (FLE Daylight Time)')));
            console.log(timeAgo(new Date('Jun 03 2018 13:12:19 GMT+0300 (FLE Daylight Time)')));
            console.log(timeAgo(new Date('May 28 2018 13:12:19 GMT+0300 (FLE Daylight Time)')));
            console.log(timeAgo(new Date('May 28 2017 13:12:19 GMT+0300 (FLE Daylight Time)')));
            console.log(timeAgo(new Date('May 28 2000 13:12:19 GMT+0300 (FLE Daylight Time)')));
            console.log(timeAgo(new Date('Sep 10 1994 13:12:19 GMT+0300 (FLE Daylight Time)')));
    

提交回复
热议问题