Использование фильтра даты и времени в формате AngularJS с датой UTC
У меня есть дата UTC в миллисекундах, которую я передаю в фильтр даты Angular для форматирования человека.
{{someDate | date:'d MMMM yyyy'}}
Ужасно, кроме someDate
находится в формате UTC, и фильтр даты считает это локальным.
Как я могу сказать Angular, что someDate
- UTC?
Спасибо.
Ответы
Ответ 1
Подобный вопрос здесь
Я перепишу свой ответ и предложу объединение:
Выход UTC кажется предметом некоторой путаницы - люди, кажется, тяготеют к моменту момента.
Заимствуя из этого ответа, вы можете сделать что-то вроде этого (то есть использовать функцию convert, которая создает дату с помощью конструктора 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="[email protected]*" 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>
вот плункер, чтобы поиграть с ним
Смотрите также это и это.
Также обратите внимание, что при использовании этого метода, если вы используете фильтр угловых дат 'Z', похоже, он все равно будет печатать ваше местное смещение часового пояса.
Ответ 2
Кажется, люди AngularJS работают над ним в версии 1.3.0.
Все, что вам нужно сделать, это добавить : 'UTC'
после строки формата. Что-то вроде:
{{someDate | date:'d MMMM yyyy' : 'UTC'}}
Как вы можете видеть в docs, вы также можете играть здесь:
Пример плунжера
Кстати, я думаю, что есть ошибка с параметром Z, так как он по-прежнему показывает локальный часовой пояс даже с "UTC".
Ответ 3
Вот фильтр, который примет строку даты ИЛИ объект javascript Date(). Он использует 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);
};
});
Итак...
{{ anyDateObjectOrString | moment: 'format': 'MMM DD, YYYY' }}
отобразится 11 ноября 2014 г.
{{ anyDateObjectOrString | moment: 'fromNow' }}
отобразится 10 минут назад
Если вам нужно вызвать несколько функций момента, вы можете их связать. Это преобразуется в UTC, а затем форматирует...
{{ someDate | moment: 'utc' | moment: 'format': 'MMM DD, YYYY' }}
Ответ 4
Существует ошибка, связанная с этим в angular.js repo
https://github.com/angular/angular.js/issues/6546#issuecomment-36721868
Ответ 5
Если вы используете moment.js, вы должны использовать функцию moment(). utc() для преобразования объекта момента в UTC. Вы можете также обрабатывать хороший формат внутри контроллера вместо представления, используя функцию moment(). Format(). Например:
moment(myDate).utc().format('MM/DD/YYYY')
Ответ 6
Развитая версия решения 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>
Ответ 7
После некоторых исследований я смог найти хорошее решение для преобразования 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>
Ответ 8
Может ли это работать, объявив фильтр следующим образом?
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);
};
});
Ответ 9
У вас также есть возможность написать настраиваемый фильтр для вашей даты, отображающий его в формате 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>
Ответ 10
Если вы работаете в .Net, то добавьте следующее в web.config внутри
<system.web>
решит вашу проблему:
<globalization culture="auto:en-US" uiCulture="auto:en-US" />