Подтвердить что ты не робот

Невозможно форматировать время и время по умолчанию MySQL

Мои даты выходят из базы данных, выглядящей так: 2013-11-21 17:43:20

Я пытаюсь использовать фильтр даты Angular, чтобы превратить их в нечто более красивое, но...

{{Objected.created | date:'shortDate'}}

или

{{Objected.created | date:'YYYY'}}

... просто выплевывает исходную строку datetime: 2013-11-21 17:43:20. Ошибок нет. Что я делаю неправильно?

Обновление Я вижу, что время datetime по умолчанию MySQL несовместимо с тем, что ожидает фильтр данных Angular. Я пытаюсь преобразовать его на лету, как это, но он бросает ошибки:

<li ng-repeat="result in data">{{ new Date(result.Job.created).toISOString() | date:'shortDate'}}</li>

Я подозреваю, что не могу создать экземпляр класса Date так, как я пытаюсь. Ошибка - синтаксическая ошибка $parse:

Обновление

Благодаря помощи @m59 я получил работу с несколькими незначительными настройками...

HTML:

<html ng-app="myApp">
...
{{Object.created | dateToISO | date:'shortDate'}}

JS:

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

myApp.filter('dateToISO', function() {
  return function(input) {
    input = new Date(input).toISOString();
    return input;
  };
});

Этот настраиваемый фильтр преобразует значение datetime MySQL по умолчанию в формат, который ожидает фильтр даты, поэтому я посылаю его, чтобы отправить его затем другой и "вуаля".

4b9b3361

Ответ 1

Вам нужно преобразовать строку даты в нечто, поддерживаемое Angular, например, ISO 8601. Вы можете преобразовать его так:

$scope.Object.created = new Date($scope.Object.created).toISOString();

Живая демонстрация здесь (нажмите).

Чтобы сделать это "на лету", вам нужен специальный фильтр. Живая демонстрация здесь (нажмите).

Разметка:

<div>{{Object.created | dateToISO | date:'shortDate'}}</div>

JavaScript:

app.filter('dateToISO', function() {
  return function(input) {
    return new Date(input).toISOString();
  };
});

Обновление:

Вот простой способ конвертировать дату вручную (firefox):

app.filter('badDateToISO', function() {
  return function(badTime) {
    var goodTime = badTime.replace(/(.+) (.+)/, "$1T$2Z");
    return goodTime;
  };
});

Ответ 2

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

Кроме того, строка даты, которую вы пытаетесь форматировать, не соответствует спецификации, указанной Angular.

Дата для форматирования как объект даты, миллисекунды (строка или номер) или различные форматы строк даты и времени ISO 8601 (например, yyyy-MM-ddTHH: mm: ss.SSSZ и его более короткие версии, такие как yyyy-MM-ddTHH: mmZ, yyyy-MM-dd или yyyyMMddTHHmmssZ). Если часовой пояс не указан в строковом вводе, время считается находящимся в локальном часовом поясе.

Где бы вы ни извлекали исходную строку, я предлагаю вам сохранить/попытаться получить ее в одном из этих форматов.

Пример JSFiddle с использованием правильного формата.

Ответ 3

Я создал для этого трубу следующим образом

import { Pipe } from "@angular/core";

@Pipe ({   name: 'DateToIso' }) класс экспорта DateToIso {

transform(value, args) {

var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;

var parts=value.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');

var converted = new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);

let newValue = converted.toISOString();

return newValue;

}

}

Ответ 4

Я создал канал

import { Pipe } from "@angular/core";

@Pipe ({   имя: DateToIso ' }) класс экспорта DateToIso {

transform(value, args) {

var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;

var parts=value.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');

var converted = new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);

let newValue = converted.toISOString();

return newValue;

}

}

а затем использовать в шаблоне

{{ p.sessionTimeFinish | DateToIso  |  date: "HH:mm" }}