Использование фильтра даты AngularJS с датой UTC
у меня есть дата UTC в миллисекундах, которую я передаю в фильтр даты Angular для форматирования человека.
{{someDate | date:'d MMMM yyyy'}}
офигенно, кроме someDate
находится в UTC, и фильтр даты считает, что он находится в локальном времени.
как я могу сказать, что угловые someDate
по UTC?
спасибо.
9 ответов:
Аналогичный Вопрос здесь
Я перепечатаю свой ответ и предложу слияние:
вывод UTC, похоже, является предметом некоторой путаницы - люди, похоже, тяготеют к момент.js.
заимствование из этого ответ, вы можете сделать что-то вроде этого (т. е. использовать функцию преобразования, которая создает дату с помощью конструктора UTC) без момент.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>
здесь plunker играть с ним
Также обратите внимание, что с помощью этого метода, если вы используете фильтр даты " Z " от Angular, похоже, он все равно будет печатать смещение локального часового пояса.
похоже, что люди AngularJS работают над этим в версии 1.3.0. Все, что вам нужно сделать, это добавить
: 'UTC'
после строки формата. Что-то вроде:{{someDate | date:'d MMMM yyyy' : 'UTC'}}
Как вы можете видеть в разделе docs, вы также можете играть с ним здесь: пример Plunker
кстати, я думаю, что есть ошибка с параметром Z, так как он все еще показывает местный часовой пояс даже с "UTC".
здесь фильтр это займет строку даты или объект javascript Date (). Он использует момент.js и может применяться любой момент.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); }; });
так...
{{ anyDateObjectOrString | moment: 'format': 'MMM DD, YYYY' }}
будет отображать 11 ноября 2014
{{ anyDateObjectOrString | moment: 'fromNow' }}
будет отображать 10 минут назад
Если вам нужно вызвать несколько функций moment, вы можете связать их. Это преобразует в UTC, а затем форматы...
{{ someDate | moment: 'utc' | moment: 'format': 'MMM DD, YYYY' }}
есть ошибка, поданная против этого в angular.JS repo https://github.com/angular/angular.js/issues/6546#issuecomment-36721868
Если вы используете момент.js вы бы использовали момент ().функция utc () для преобразования объекта moment в UTC. Вы также можете обрабатывать хороший формат внутри контроллера вместо представления с помощью moment().функция format. Например:
moment(myDate).utc().format('MM/DD/YYYY')
усовершенствованный вариант ossek решение
пользовательский фильтр более подходит, то вы можете использовать его в любом месте проекта
js file
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>
после некоторых исследований я смог найти хорошее решение для преобразования 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>
может ли он работать, объявляя фильтр следующим образом?
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); }; });
У вас также есть возможность написать пользовательский фильтр для вашей даты, которые отображают его в формате 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>