Angular显示未知时区的错误时间

时间:2016-07-25 16:22:17

标签: angularjs

flight.departure_at是UTC格式2016-05-04T19:00:00.000Z

当我在页面中显示此表达式时,

它的格式完全出乎意料。

为什么12:00会出来?怎么会?

我还想知道如何在全局范围内保留所有时间格式,而无需在任何地方添加选项。它将使整个应用程序易受攻击

Departure_time: {{flight.departure_at}} ||| {{flight.departure_at | date: 'HH:mm'}}

输出

Departure_time: 2016-05-04T19:00:00.000Z ||| 12:00

3 个答案:

答案 0 :(得分:0)

此标准称为ISO-8601,格式为:YYYY-MM-DDTHH:mm:ss.sssZ

'T'只是ISO-8601格式的日期和时间之间的分隔符。

'Z'为零时区(您获得12:00,因为它会转换为您的时区)

我们可以像这样使用解析,

var date = new Date('2016-05-04T19:00:00.000Z');
console.log(date.getUTCHours()); // Hours - 19
console.log(date.getUTCMinutes()); //0
console.log(date.getUTCSeconds());// 0


console.log(Date.parse(date));
console.log(new Date(Date.parse(date))); 

OR

Date.parse(DATE)以标准时间格式获取时间

UTC

答案 1 :(得分:0)

正如另一个关于为用户个性化时区的主题所述 - 我发现这在处理Angular中的时区时非常有用。 (https://stackoverflow.com/a/35161107/3585278

module.config(['$provide', function($provide) {
var DEFAULT_TIMEZONE = 'GMT';

$provide.decorator('dateFilter', ['$delegate', '$injector', function($delegate, $injector) {
    var oldDelegate = $delegate;

    var standardDateFilterInterceptor = function(date, format, timezone) {
        if(angular.isUndefined(timezone)) {
            timezone = DEFAULT_TIMEZONE;
        }
    return oldDelegate.apply(this, [date, format, timezone]);
    };

    return standardDateFilterInterceptor;
    }]);
}]);

答案 2 :(得分:0)

我建议您使用Angular moment表示前端的所有日期时间相关内容,并使用moment作为控制器部分。

您应该将所有时间存储在后端的UTC中,然后在前端,您可以将用户的时区全局设置为

app.constant('angularMomentConfig', {
  'timezone' : <user's timezone> 
});

现在在前端渲染UTC时间而不用担心时区(确保所有变量都是momentDate对象):

<td ng-bind="flight.departure_at| amDateFormat:'HH:mm'"></td>