Формат даты и времени в AngularJS


123

Как правильно отображать дату и время в AngularJS?

В выходных данных ниже показаны входные и выходные данные с фильтром даты AngularJS и без него:

In: {{v.Dt}}  
AngularJS: {{v.Dt | date:'yyyy-MM-dd HH:mm:ss Z'}}

Это печатает:

In: 2012-10-16T17:57:28.556094Z 
AngularJS: 2012-10-16T17:57:28.556094Z

Желаемый формат отображения - 2010-10-28 23:40:23 0400или2010-10-28 23:40:23 EST

Ответы:


63

v.Dt, скорее всего, не является объектом Date ().

См. Http://jsfiddle.net/southerd/xG2t8/

но в вашем контроллере:

scope.v.Dt = Date.parse(scope.v.Dt);

Дэвид, в моем случае дата хранится в базе данных в формате ДД / ММ / ГГГГ. Я конвертирую это, я показываю ему пользовательский формат DD.MM.YYYY в текстовом поле или беру пользовательский ввод в этом формате, и то же самое обновляется в моей модели. как изменить это перед передачей в БД. как мне измениться
Йогеш 09

120

Ваш код должен работать так, как вы видите эту скрипку .

Вы должны убедиться, что у вас v.Dtправильный объект Date, чтобы он работал.

{{dt | date:'yyyy-MM-dd HH:mm:ss Z'}}

или если dateFormat определен в области видимости как dateFormat = 'yyyy-MM-dd HH: mm: ss Z':

{{dt | date:dateFormat }}

Поскольку формат является косметическим вариантом, обычно лучше делать это непосредственно на виде.
Puce

thnkx..super ans. можно ли показывать время в 12-часовом формате?
Вишну Прасад

dt может быть временной меткой unix в целочисленном формате, тоже работает
tom10271

это не обязательно должен быть Dateтип переменной. Timestamp long тоже хорошо работает
Влад

59

Я знаю, что это старый предмет, но подумал, что стоит рассмотреть другой вариант.

Поскольку исходная строка не включает разграничитель «T», реализация по умолчанию в Angular не распознает его как дату. Вы можете принудительно использовать новую дату, но это немного неудобно для массива. Поскольку вы можете объединить фильтры вместе, вы можете использовать фильтр для преобразования введенных вами данных в дату, а затем применить фильтр date: к преобразованной дате. Создайте новый настраиваемый фильтр следующим образом:

app
.filter("asDate", function () {
    return function (input) {
        return new Date(input);
    }
});

Затем в разметке вы можете соединить фильтры вместе:

{{item.myDateTimeString | asDate | date:'shortDate'}}

Да, более надежный и эффективный .. Спасибо, что поделился
azhar_SE_nextbridge

56

вы можете получить фильтр «дата» следующим образом:

var today = $filter('date')(new Date(),'yyyy-MM-dd HH:mm:ss Z');

Это даст вам сегодняшнюю дату в желаемом формате.


лол да, Леандро. Я не знаю, как это случилось. Думаю, я думал «использовать».
CodeOverRide

49

Вот фильтр, который будет принимать строку даты ИЛИ объект 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);
  };
});

Так...

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

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

{{ anyDateObjectOrString | moment: 'fromNow' }}

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

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

{{ someDate | moment: 'utc' | moment: 'format': 'MMM DD, YYYY' }}

https://gist.github.com/cmmartin/341b017194bac09ffa1a


Это более мощный метод ! Спасибо!
Моддер

2
Это великолепно, и его также можно комбинировать с Moment Timezone. например: {{foo.created_at | момент: 'tz': 'Америка / Нью-Йорк' | moment: 'format': 'h: mm a z'}}
Дэйв Коллинз

22

Вот несколько популярных примеров:

<div>{{myDate | date:'M/d/yyyy'}}</div> 7/4/2014

<div>{{myDate | date:'yyyy-MM-dd'}}</div> 2014-07-04

<div>{{myDate | date:'M/d/yyyy HH:mm:ss'}}</div> 04.07.2014 12:01:59


простой, элегантный и именно то , что было предложено
Игнотус

15

Вы видели раздел документации « Написание директив (короткая версия) » ?

HTML

<div ng-controller="Ctrl2">
      Date format: <input ng-model="format"> <hr/>
      Current time is: <span my-current-time="format"></span>
</div> 

JS

function Ctrl2($scope) {
  $scope.format = 'M/d/yy h:mm:ss a';
}

2
Я считаю ваш комментарий очень верным. Обучение фильтрам - важная часть AngularJS. Это действительно не так уж и сложно.
Spock

6

Внутри контроллера формат можно отфильтровать, введя $ filter.

var date = $filter('date')(new Date(),'MMM dd, yyyy');

5

Если вы хотите вывести что-то вроде «30 января 2017 г., 16:31:20», следуйте простому шагу.

step1 - объявить следующую переменную в контроллере js

$scope.current_time = new Date();

step2 - отображение на html-странице, например

{{current_time | дата: 'средний'}}


5

мы можем отформатировать дату на стороне просмотра в угловом формате, это очень просто ... проверьте пример ниже:

{{dt | date: "дд-ММ-гггг"}}


3

Вы можете использовать momentjsдля реализации фильтра даты и времени в angularjs. Например:

angular.module('myApp')
 .filter('formatDateTime', function ($filter) {
    return function (date, format) {
        if (date) {
            return moment(Number(date)).format(format || "DD/MM/YYYY h:mm A");
        }
        else
            return "";
    };
});

Где дата в формате отметки времени.


1

Добавить $filterзависимость в контроллер.

var formatted_datetime = $filter('date')(variable_Containing_time,'yyyy-MM-dd HH:mm:ss Z')

2
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода. Также постарайтесь не загромождать свой код пояснительными комментариями, это снижает удобочитаемость как кода, так и пояснений!
kayess

0

Я бы посоветовал вам использовать moment.js, у него хорошая поддержка форматирования даты в соответствии с местными стандартами.

создать фильтр, который внутренне использует метод moment.js для форматирования даты.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.