AngularJS全局日期时区偏移量

18

我想显示与用户时区相关的日期。

我希望Angular有一种方法可以全局配置Date过滤器来实现这一点——逐个案例手动执行此操作感觉不对。

我的时间戳已经包含在一个timestamp()函数中(简单地乘以1000),但如果不必要,我更愿意不修改该函数。

编辑:

我正在这样做,并且它起作用了,但如上所述,如果可能的话,我希望将其设置为更高级别。

$scope.timestamp = function (unix_time) {
    var epoch = (unix_time * 1000);
    var date = new Date();
    var localOffset = (-1) * date.getTimezoneOffset() * 60000;
    var stamp = Math.round(new Date(epoch + localOffset).getTime());
    return stamp;
};
3个回答

23

所以,由于angular 1.4.x的变化,现在这非常容易。处理这个问题的正确方式是创建一个装饰器,在运行内置日期过滤器之前修改它。这很容易做到,并且不会对性能产生影响。

以下是我使用的一种方法。如果没有指定时区,则简单地添加DEFAULT_TIMEZONE。这将使应用程序中的所有日期移动到GMT,只要没有给出其他时区。

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;
     }]);
}]);

10

来自官方文档:

时区

请注意,Angular日期时间过滤器使用浏览器的时区设置。因此,同一应用程序将根据运行应用程序的计算机的时区设置显示不同的时间信息。目前Javascript和Angular都不支持开发人员指定具有时区的日期。

http://docs.angularjs.org/guide/i18n

更高级的方法可能是创建一个包装器类型(也称为类等)并将您的函数作为构造函数。 这应该在应用程序的入口点编码,以便可以在任何地方使用它。


一个包装类型(也称为类...),其中您的函数作为构造函数。你能详细说明一下吗?这里有一个例子吗? - couzzi
1
这已经不被认为是有效的了。Angular 的日期过滤器($filter)现在支持第三个参数“时区(timezone)”。它可以接受'UTC', 'GMT', 或者像'+0430'这样指定的时区偏移量。下一个需要回答的问题,是可以在某些配置中设置,以便在没有时区时始终应用类似“GMT”的内容。 - thegreenpizza

1

我已经使用了momentjs,它非常好用,但在这种情况下,Angular可以很好地处理日期——除了时区问题。 - couzzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接