Использование фильтра даты AngularJS с датой UTC

У меня есть дата в формате UTC в миллисекундах, которую я передаю фильтру даты Angular для человеческого форматирования.

{{someDate | date:'d MMMM yyyy'}}

Замечательно, за исключением того, что someDate находится в формате UTC, а фильтр даты считает, что это местное время.

Как я могу сказать Angular, что someDate - это UTC?

Спасибо.


person Francisc    schedule 18.12.2013    source источник
comment
Фильтр date автоматически преобразует его в местное время.   -  person zs2020    schedule 18.12.2013
comment
Он не знает, что это дата в формате UTC, поэтому преобразование неверно.   -  person Francisc    schedule 19.12.2013
comment
@see stackoverflow.com/questions/20470139/   -  person Dennis Jaamann    schedule 22.01.2014
comment
Возможный дубликат Angular: фильтр даты добавляет часовой пояс, как выводить UTC ?   -  person jberryman    schedule 28.10.2015
comment
{{someDate | дата: 'д ММММ гггг': 'UTC'}}   -  person Ali786    schedule 28.06.2016


Ответы (10)


Аналогичный вопрос здесь

Я перепубликую свой ответ и предложу слияние:

Выходное UTC кажется предметом некоторой путаницы - люди, похоже, тянутся к moment.js.

Заимствуя этот ответ, вы мог бы сделать что-то вроде этого (т.е. использовать функцию преобразования, которая создает дату с конструктором UTC) без moment.js:

контроллер

var app1 = angular.module('app1',[]);

app1.controller('ctrl',['$scope',function($scope){

  var toUTCDate = function(date){
    var _utc = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
    return _utc;
  };

  var millisToUTCDate = function(millis){
    return toUTCDate(new Date(millis));
  };

    $scope.toUTCDate = toUTCDate;
    $scope.millisToUTCDate = millisToUTCDate;

  }]);

шаблон

<html ng-app="app1">

  <head>
    <script data-require="angular.js@*" data-semver="1.2.12" src="http://code.angularjs.org/1.2.12/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body>
    <div ng-controller="ctrl">
      <div>
      utc {{millisToUTCDate(1400167800) | date:'dd-M-yyyy H:mm'}}
      </div>
      <div>
      local {{1400167800 | date:'dd-M-yyyy H:mm'}}
      </div>
    </div>
  </body>

</html>

вот плункер, чтобы поиграть с ним

См. Также this и this.

Также обратите внимание, что с помощью этого метода, если вы используете 'Z' из фильтра даты Angular, кажется, что он все равно будет печатать смещение вашего местного часового пояса.

person ossek    schedule 14.02.2014

Похоже, что ребята из AngularJS работают над версией 1.3.0. Все, что вам нужно сделать, это добавить : 'UTC' после строки формата. Что-то типа:

{{someDate | date:'d MMMM yyyy' : 'UTC'}}

Как видно из документации, вы также можете играть здесь: пример Plunker

Кстати, я думаю, что есть ошибка с параметром Z, поскольку он все еще показывает местный часовой пояс даже с 'UTC'.

person nir    schedule 21.09.2014
comment
Я думаю, что заказчику нужно отформатировать дату в формате UTC в строку локального формата, как раз наоборот. - person tedyyu; 24.10.2014
comment
К сожалению, этот дополнительный параметр часового пояса не поддерживается в Angular 2 Date труба. Выполнение чего-то вроде того, что предлагается в первом ответе, по-прежнему будет работать в Angular 2. - person munsellj; 02.08.2016
comment
Привет @nir Это работает для меня. вопрос: в любом случае я могу получить названия месяцев на испанском языке вместо английского, как указано выше. поэтому, если нужно указать имена месяцев, такие как январь, февраль, март ... и т. д., мне нужно сделать их как: enero, febrero, marzo? Любые указатели помогут. - person Nirmal; 30.08.2017
comment
Если вы хотите преобразовать значение 1506508005197 в 27.09.2010, используйте предложенный выше метод nir {{record.deactivateDate | дата: 'ММ-дд-гггг': 'UTC'}} - person Sagar S.; 12.01.2018
comment
Независимо от того, что он отвечает на вопрос, это то, что я искал, и он отлично работает. Но, возможно, для других: если вы хотите, чтобы это было наоборот, вам просто нужно убедиться, что ваш сервер отправляет его как 2018-07-17T21: 26: 00.000 + 00: 00. Затем Angular знает, что это время в формате UTC, и по умолчанию преобразует его правильно в местное время. - person CularBytes; 18.07.2018

Вот фильтр, который будет принимать строку даты ИЛИ объект Date () javascript. Он использует Moment.js и может применять любые Moment.js, например, популярный 'fromNow'

angular.module('myModule').filter('moment', function () {
  return function (input, momentFn /*, param1, param2, ...param n */) {
    var args = Array.prototype.slice.call(arguments, 2),
        momentObj = moment(input);
    return momentObj[momentFn].apply(momentObj, args);
  };
});

So...

{{ anyDateObjectOrString | moment: 'format': 'MMM DD, YYYY' }}

отобразится 11 ноября 2014 г.

{{ anyDateObjectOrString | moment: 'fromNow' }}

будет отображаться 10 минут назад

Если вам нужно вызвать несколько мгновенных функций, вы можете связать их в цепочку. Это преобразуется в UTC, а затем форматирует ...

{{ someDate | moment: 'utc' | moment: 'format': 'MMM DD, YYYY' }}
person Charlie Martin    schedule 12.11.2014

В репозитории angular.js https://github.com/angular/angular.js/issues/6546#issuecomment-36721868.

person Jonathan Lau    schedule 09.05.2014

Усовершенствованная версия решения ossek

Пользовательский фильтр более уместен, тогда вы можете использовать его в любом месте проекта.

файл js

var myApp = angular.module('myApp',[]);

myApp.filter('utcdate', ['$filter','$locale', function($filter, $locale){

    return function (input, format) {
        if (!angular.isDefined(format)) {
            format = $locale['DATETIME_FORMATS']['medium'];
        }

        var date = new Date(input);
        var d = new Date()
        var _utc = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
        return $filter('date')(_utc, format)
    };

 }]);

в шаблоне

<p>This will convert UTC time to local time<p>
<span>{{dateTimeInUTC | utcdate :'MMM d, y h:mm:ss a'}}</span>
person Dasun    schedule 13.08.2015
comment
на самом деле это неверно, потому что он больше не использует функции UTC для date - в отличие от сценария ossek. это сработало бы, если бы дата в input включала строку UTC в конце. - person Jörn Berkefeld; 06.05.2016
comment
Спасибо, что указали. Похоже, оригинальный ответ был обновлен после моего ответа :) Я просто заключил его функцию в фильтр. - person Dasun; 06.05.2016
comment
пока мы занимаемся этим: могу ли я предложить использовать $locale['DATETIME_FORMATS']['medium'] вместо фиксированного резервного формата? таким образом вы используете собственную локализацию angular. Ваш формат ужасно похож на формат en_US, что очень редко встречается в других странах мира. - person Jörn Berkefeld; 13.05.2016
comment
Выполнено! :). Раздел шаблона оставлен без изменений, чтобы показать, что можно использовать для отмены форматирования по умолчанию. - person Dasun; 14.05.2016

Если вы используете moment.js, вы должны использовать функцию moment (). Utc () для преобразования объекта момента в UTC. Вы также можете обрабатывать красивый формат внутри контроллера вместо представления, используя функцию moment (). Format (). Например:

moment(myDate).utc().format('MM/DD/YYYY')
person duffcodester    schedule 02.09.2014
comment
Он не хочет преобразовывать его в UTC, поскольку это уже время в формате UTC. Вы должны использовать это так: moment().utc(myDate).format('MM/DD/YYYY') - person nir; 07.06.2016

После некоторых исследований я смог найти хорошее решение для преобразования UTC в местное время, взгляните на скрипку. Надеюсь, это поможет

https://jsfiddle.net/way2ajay19/2kramzng/20/

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app ng-controller="MyCtrl">
  {{date | date:'yyyy-mm-dd hh:mm:ss' }}
</div>


<script>
function MyCtrl($scope) {
 $scope.d = "2017-07-21 19:47:00";
  $scope.d = $scope.d.replace(" ", 'T') + 'Z';
  $scope.date = new Date($scope.d);
}
</script>
person user3444999    schedule 24.07.2017

У вас также есть возможность написать собственный фильтр для вашей даты, который будет отображать ее в формате UTC. Обратите внимание, что я использовал toUTCString().

var app = angular.module('myApp', []);

app.controller('dateCtrl', function($scope) {
    $scope.today = new Date();
});
    
app.filter('utcDate', function() {
    return function(input) {
       return input.toUTCString();
    };
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>  
  
<div ng-app="myApp" ng-controller="dateCtrl">      
    Today is {{today | utcDate}}       
</div>

person Mistalis    schedule 27.04.2017

Могло ли это сработать, объявив фильтр следующим образом?

   app.filter('dateUTC', function ($filter) {

       return function (input, format) {
           if (!angular.isDefined(format)) {
               format = 'dd/MM/yyyy';
           }

           var date = new Date(input);

           return $filter('date')(date.toISOString().slice(0, 23), format);

       };
    });
person Matteo Piazza    schedule 22.03.2016

Если вы работаете в .Net, добавьте следующее в web.config внутри

<system.web>

решит вашу проблему:

<globalization culture="auto:en-US" uiCulture="auto:en-US" />
person Muhammad Waqas    schedule 28.01.2019