为什么我的'很久以前'滤镜在chrome中工作,而不是safari或firefox

Why does my 'time ago' filter work in chrome and not safari or firefox?

本文关键字:safari firefox chrome 很久以前 我的 滤镜 为什么 工作      更新时间:2023-09-26

我在应用程序中使用这个角度过滤器来获取时间戳,并将其转换为"时间前"时间,例如"3小时前"。我发现这个过滤器是github的要旨,并将其分叉,使其能够从UTC转换为最终用户的本地时间。现在我可以弄清楚为什么它似乎只在chrome中工作(注意:我也不知道原版是否在chrome之外工作过(。Safari和Firefox在很长一段时间内从我的应用程序中输出所有可用的时间,从几分钟前到几周前。有什么想法吗?

app.filter('timeago', function () {
    //time: the time
    //local: compared to what time? default: now
    //raw: whether you want in a format of "5 minutes ago", or "5 minutes"
    return function (time, local, raw) {
        var timeZoneOffset = (new Date().getTimezoneOffset()) * 60000;
        if (!time) return "never";
        if (!local) {
            (local = Date.now());
        }
        if (angular.isDate(time)) {
            time = time.getTime();
        } else if (typeof time === "string") {
            // convert string time to milliseconds
            time = new Date(time).getTime();
        }
        // convert UTC to local
        time = time - timeZoneOffset;
        if (angular.isDate(local)) {
            local = local.getTime();
        }else if (typeof local === "string") {
            local = new Date(local).getTime();
        }
        if (typeof time !== 'number' || typeof local !== 'number') {
            return;
        }
        var span = [],
            MINUTE = 60,
            HOUR = 3600,
            DAY = 86400,
            WEEK = 604800,
            MONTH = 2629744,
            YEAR = 31556926,
            DECADE = 315569260;

        var offset = Math.abs((local - time) / 1000);
        if (offset <= MINUTE)              span = [ '', raw ? 'now' : 'a minute' ];
        else if (offset < (MINUTE * 60))   span = [ Math.round(Math.abs(offset / MINUTE)), 'min' ];
        else if (offset < (HOUR * 24))     span = [ Math.round(Math.abs(offset / HOUR)), 'hr' ];
        else if (offset < (DAY * 7))       span = [ Math.round(Math.abs(offset / DAY)), 'day' ];
        else if (offset < (WEEK * 52))     span = [ Math.round(Math.abs(offset / WEEK)), 'week' ];
        else if (offset < (YEAR * 10))     span = [ Math.round(Math.abs(offset / YEAR)), 'year' ];
        else if (offset < (DECADE * 100))  span = [ Math.round(Math.abs(offset / DECADE)), 'decade' ];
        else                               span = [ '', 'a long time' ];
        span[1] += (span[0] === 0 || span[0] > 1) ? 's' : '';
        span = span.join(' ');
        if (raw === true) {
            return span;
        }
        return (time <= local) ? span + ' ago' : 'in ' + span;
    };
});

编辑:

以下是我如何在html中使用它的浓缩示例,以及我的api返回日期字符串的格式。如果其他人没有问题,这可能与日期字符串如何转换为毫秒时间有关。

角度控制器内的时间

$scope.time = "2014-07-04 23:04:12";

从html

<span>{{ time | timeago }}</span>

firefox 显示

"在很长一段时间内">

Date.parse可能依赖于实现。基于这篇SO文章和推荐,我修改了自定义的parseDate函数,并验证了它在IE、Chrome和Firefox上都能工作。

 app.controller('ctrl', function($scope) {
     // parse a date in yyyy-mm-dd format
     function parseDate(input) {
        var parts = input.split('-');
        var timeBits = parts[2].split(' ');
        var hms = timeBits[1].split(':'); 
        // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
        return new Date(parts[0], parts[1]-1, timeBits[0], hms[0], hms[1], hms[2]); // Note: months are 0-based
    }
    $scope.time = parseDate("2014-07-04 23:04:12");
    alert($scope.time);
  });

我也遇到了同样的问题。对我来说,带时区的日期格式不起作用。

"2014-07-04 23:04:12 GMT" 不起作用

"2014/07/04 23:04:12 GMT"这起作用