Смещение часового пояса глобальной даты AngularJS

Я хочу показать даты относительно часовых поясов пользователей.

Я надеюсь, что у 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;
};

person couzzi    schedule 17.02.2014    source источник


Ответы (3)


Итак, благодаря изменениям в 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;
     }]);
}]);
person thegreenpizza    schedule 02.02.2016

Из официальной документации:

Часовые пояса

Имейте в виду, что фильтр даты и времени Angular использует настройки часового пояса браузера. Таким образом, одно и то же приложение будет отображать разную информацию о времени в зависимости от настроек часового пояса компьютера, на котором запущено приложение. Ни Javascript, ни Angular в настоящее время не поддерживают отображение даты с часовым поясом, указанным разработчиком.

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

Уровень «выше» может заключаться в создании оболочки type (класс AKA, ...) с вашей функцией в качестве конструктора. Это должно быть закодировано в точке входа приложения, чтобы его можно было использовать везде.

person Mardie    schedule 18.02.2014
comment
a wrapper type (AKA class, ...) with your function as constructor. Можно здесь поподробнее? У вас есть пример? - person couzzi; 18.02.2014
comment
Это больше не действует. $filter даты Angular теперь поддерживает третий параметр «часовой пояс». Возьмите «UTC», «GMT» или смещение часового пояса, указанное следующим образом: «+0430». Следующий вопрос, который нужно задать, чтобы ответить на вопрос Куцци, заключается в том, можно ли настроить его в какой-либо конфигурации, чтобы всегда применялось что-то вроде «GMT», когда часовой пояс отсутствует. - person thegreenpizza; 02.02.2016

Вы проверили momentjs http://momentjs.com/?

Также есть angular-timezones, но я не могу говорить с этим пакетом (https://github.com/michaelahlers/angular-timezones).

person JayInNyc    schedule 18.02.2014
comment
Я использовал momentjs, и это здорово, но в этом случае Angular отлично обрабатывает дату — за исключением этого часового пояса. - person couzzi; 18.02.2014