Impossible de formater l'heure par défaut de MySQL

Mes dates sortent de la base de données comme ceci: 2013-11-21 17:43:20

J'essaie d'utiliser le filtre de date de l'utilisateur Angular pour les transformer en quelque chose de plus jolie, mais …

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

ou

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

… il suffit de cracher la chaîne datetime originale: 2013-11-21 17:43:20 . Il n'y a pas d'erreurs. Qu'est-ce que je fais mal?

Mise à jour, je vois que le délai par défaut de MySQL est incompatible avec ce que le filtre de données d'Angular attend. Je tente de le convertir à la volée comme ça, mais il lance des erreurs:

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

Je soupçonne que je ne peux pas instancier la classe Date de la façon dont j'essaie. L'erreur est une analyse par $: erreur de syntaxe.

Mettre à jour

Grâce à l'aide de @m59, j'ai travaillé avec quelques ajustements mineurs …

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; }; }); 

Ce filtre personnalisé convertit la date et heure de MySQL par défaut dans le format que le filtre de date attend, donc je l'envoie jeter un puis un autre et "voila".

Vous devez convertir votre chaîne de date sur quelque chose soutenu par Angular, comme le format ISO 8601. Vous pouvez le convertir comme ceci:

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

Démo en direct ici (cliquez).

Pour le faire à la volée, vous avez besoin d'un filtre personnalisé. Démo en direct ici (cliquez).

Marquage:

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

JavaScript:

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

Mettre à jour:

Voici un moyen simple de convertir votre date manuellement (firefox):

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

Le format de date que vous avez spécifié est incorrect. YYYY devrait être YYYY , consultez la documentation pour un autre exemple.

En outre, la chaîne de date que vous essayez de formater ne correspond pas à la spécification qu'Angular possède.

Date pour formater en tant qu'objet Date, millisecondes (chaîne ou nombre) ou différents formats de chaîne datetime ISO 8601 (p. Ex. Yyyy-MM-ddTHH: mm: ss.SSSZ et ses versions plus courtes comme yyyy-MM-ddTHH: mmZ, aaaa-MM -dd ou aaaaMMddTHHmmssZ). Si aucun fuseau horaire n'est spécifié dans l'entrée de chaîne, l'heure est considérée comme étant dans le fuseau horaire local.

Partout où vous récupérez la chaîne d'origine, je vous suggère de stocker / essayer de la récupérer dans l'un de ces formats.

Exemple JSFiddle en utilisant un format correct.

J'ai créé une pipe pour cela comme suit

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

@Pipe ({name: 'DateToIso'}) classe d'exportation 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; } 

}

J'ai créé un tuyau

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

@Pipe ({nom: DateToIso '}) classe d'exportation 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; } 

}

Et ensuite utiliser dans le modèle

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