У меня есть месяц как число (1,2,3,...) и хотел бы отобразить соответствующее имя. Как я могу это сделать?
Можно ли использовать {{ date_expression | date[:format] }}
У меня есть месяц как число (1,2,3,...) и хотел бы отобразить соответствующее имя. Как я могу это сделать?
Можно ли использовать {{ date_expression | date[:format] }}
Пожалуйста, посмотрите документацию на http://docs.angularjs.org/api/ng.filter:date. Там вы увидите нужный формат:
{{date_expression | date:'MMMM'}}
Если у вас есть индекс месяца, вы можете просто создать свой собственный фильтр:
myApp.filter('monthName', [function() {
return function (monthNumber) { //1 = January
var monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December' ];
return monthNames[monthNumber - 1];
}
}]);
Затем в вашем шаблоне:
{{date_expression | monthName}}
Я должен понять, что у вас есть месяц как целочисленное значение, а не объект даты. Фильтр даты работает только с форматированным datetime или миллисекундой как строки, миллисекунды как целочисленные или Date
.
Таким образом, вам нужно будет преобразовать значение целого месяца в значение, которое понимает фильтр. Вы можете взять целое число месяца и сделать его нулевым индексом, а затем создать из него новый объект Date
, а затем применить фильтр к этому Date
.
Контроллер:
angular.module('demo', [])
.controller('DemoCtrl', function($scope) {
// here the original value
$scope.month = 0; // 0 for january, 11 for december
// watch for changes to the value of month. turn it into a new date object that angular can bind and filter in the view
$scope.$watch('month', function(val) {
// note: if you are expecting the month value to be one-indexed, you'll need to subtract 1 from val to make it zero-indexed as Date expects
$scope.date = new Date(2014, val);
});
});
Вид:
{{ date | date:'MMMM' }}
Другой вариант - использовать службу $filter
напрямую, если вам нужен более прямой способ преобразования значения. Вы делаете в основном то же самое, просто форматируете значение в контроллере, а не в представлении.
Контроллер:
// Code goes here
angular.module('demo', [])
.controller('DemoCtrl', function($scope, $filter) {
// here the original value
$scope.month = 0;
// watch for changes to the value of month, and then format it directly
$scope.$watch('month', function(val) {
$scope.date = $filter('date')(new Date(2014, val), 'MMMM');
});
});
Вид:
{{ date }}
Я нашел ответ. Проблема проста. Мы должны преобразовать время даты mysql в javascript дату, тогда только вы можете отформатировать его в javascript.
поэтому мой формат: 2008-04-25 00:00:00
app.filter('format', function () {
return function (item) {
var t = item.split(/[- :]/);
var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]);
var time=d.getTime();
return time;
};
});
Я преобразовал mysql в javascript, а затем в миллисекунду, а затем применил мой фильтр к его работе. Это может быть неэффективно. Его работа в отличной манере. Надеюсь, это поможет кому-то.
так что мой html:
<li ng-repeat="x in names">
<div class="date">
<span class="day">{{ x.created_at | format | date:'d'}}</span>
<span class="month">{{ x.created_at | format | date:'MMM'}}</span>
</div>
<p><a href="#">{{ x.study_description | makeUppercase}}</a></p>
</li>
Работает отлично. Ответ @Нишант дает мне undefined. Я поддержал его, поскольку он кажется хорошим для некоторых людей. Поддержка формата даты также зависит от инструментов браузера.
Поистине, самый простой способ - это комбинация двух других ответов, размещенных здесь. Использование фильтра в фильтре для получения имени преобразования и отображения месяца в текущем языковом наборе:
app.filter('monthname',['$filter',function($filter){
return function(month) {
return $filter("date")(new Date(0,month),'MMMM');
}
}]);
Теперь вы можете использовать этот способ {{ 3 | monthname }}
Обратите внимание, что без этого исходный фильтр {{ 3 | date:'MMMM' }}
не будет работать, поскольку он ожидает, что тип Date
будет использоваться как аргумент, а не число.
Используйте MM, чтобы получить месяц в числовом
{{message.end_date | date : "dd-MM-y"}}
Это даст вам результат как 12-01-2017
angular.module('demo', [])
.controller('DemoCtrl', ['$scope', '$filter', 'lodash', function($scope, $filter, _) {
$scope.monthNames = _.range(12).map(function(m) {
return $filter("date")(new Date(0, m), 'MMMM'); });
}]);
Я использую lodash, чтобы получить диапазон чисел от 0 до 11, но вы можете легко получить этот список другим способом.
Строка формата может состоять из следующих элементов в течение нескольких месяцев:
"MMMM": месяц в году (январь-декабрь) - {{D_V | date:'yyyy-MMMM-dd'}}
"МММ": месяц в году (январь-декабрь) - {{D_V | date:'yyyy-MMM-dd'}}
'ММ': месяц в году, дополненный (01-12) - {{D_V | date:'yyyy-MM-dd'}}
'M': месяц в году (1-12) - {{D_V | date:'yyyy-M-dd'}}
Знайте больше на Angular Фильтр даты JS
Заглядывая в исходный код фильтра даты в Angular filters.js, я заметил, что Angular хранит список месяцев в $locale.DATETIME_FORMATS.MONTH
. Вы можете использовать его для создания очень эффективного фильтра:
var app = angular.module("app", []);
app.filter("month", function($locale) {
return function(month) {
return $locale.DATETIME_FORMATS.MONTH[month];
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
<p ng-repeat="num in [0,1,2,3,4,5,6,7,8,9,10,11]">
<span ng-bind="$index + 1"></span>:
<span ng-bind="$index | month"></span>
</p>
</div>