![](/img/trans.png)
[英]Why does my website work in some Chrome, Opera, and Safari but not FireFox or IE?
[英]Why does my 'time ago' filter work in chrome and not safari or firefox?
我在应用程序中使用此角度滤波器进行时间戳记并将其转换为“ 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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.