Je prends ma première fissure à Ajax avec jQuery. Je reçois mes données sur ma page, mais j'ai des problèmes avec les données JSON qui sont renvoyées pour les types de données Date. Fondamentalement, je reçois une chaîne qui ressemble à ceci:
/Date(1224043200000)/
De quelqu'un totalement nouveau sur JSON - Comment puis-je formater cela en un format de date courte? Cela devrait-il être géré quelque part dans le code jQuery? J'ai essayé le jQuery.UI.datepicker
plugin $.datepicker.formatDate()
sans succès.
FYI: Voici la solution que j'ai trouvée en utilisant une combinaison des réponses ici:
function getMismatch(id) {
$.getJSON("Main.aspx?Callback=GetMismatch",
{ MismatchId: id },
function (result) {
$("#AuthMerchId").text(result.AuthorizationMerchantId);
$("#SttlMerchId").text(result.SettlementMerchantId);
$("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
$("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
$("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
$("#LastUpdatedBy").text(result.LastUpdateNt);
$("#ProcessIn").text(result.ProcessIn);
}
);
return false;
}
function formatJSONDate(jsonDate) {
var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
return newDate;
}
Cette solution a obtenu mon objet de la méthode de rappel et affiché correctement les dates sur la page en utilisant la bibliothèque de format de date.
Date
.Réponses:
eval()
n'est pas nécessaire. Cela fonctionnera bien:La
substr()
fonction supprime la/Date(
partie, et laparseInt()
fonction obtient l'entier et ignore le)/
à la fin. Le nombre résultant est transmis auDate
constructeur.J'ai intentionnellement omis la radix (le deuxième argument de
parseInt
); voir mon commentaire ci-dessous .De plus, je suis entièrement d'accord avec le commentaire de Rory : les dates ISO-8601 sont préférées à cet ancien format - donc ce format ne devrait généralement pas être utilisé pour de nouveaux développements. Voir l'excellente bibliothèque Json.NET pour une excellente alternative qui sérialise les dates en utilisant le format ISO-8601.
Pour les dates JSON au format ISO-8601, passez simplement la chaîne dans le
Date
constructeur:la source
Vous pouvez l'utiliser pour obtenir une date de JSON:
Et puis vous pouvez utiliser un script JavaScript Date Format (1,2 Ko lorsqu'il est minifié et compressé) pour l'afficher comme vous le souhaitez.
la source
jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
new Function
est presque aussi mauvais queeval
: dev.opera.com/articles/view/efficient-javascript/…Pour ceux qui utilisent Newtonsoft Json.NET , découvrez comment le faire via Native JSON dans IE8, Firefox 3.5 plus Json.NET .
La documentation sur la modification du format des dates écrite par Json.NET est également utile: Sérialisation des dates avec Json.NET
Pour ceux qui sont trop paresseux, voici les étapes rapides. Comme JSON a une implémentation DateTime lâche, vous devez utiliser le
IsoDateTimeConverter()
. Notez que depuis Json.NET 4.5, le format de date par défaut est ISO, donc le code ci-dessous n'est pas nécessaire.Le JSON passera par
Enfin, du JavaScript pour convertir la date ISO en date JavaScript:
Je l'ai utilisé comme ça
la source
new Date("2009-04-12T20:44:55")
+a[1]
etc représente les morceaux du tableau de l'expression régulière et le le+
jetterait à un nombre, donc+a[1]
égal à2009
etc. Voici la répartition du tableau:0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
L'exemple d'origine:
ne reflète pas la mise en forme utilisée par WCF lors de l'envoi de dates via WCF REST à l'aide de la sérialisation JSON intégrée. (au moins sur .NET 3.5, SP1)
J'ai trouvé la réponse ici utile, mais une légère modification de l'expression régulière est nécessaire, car il semble que le décalage GMT du fuseau horaire soit ajouté au nombre renvoyé (depuis 1970) dans WCF JSON.
Dans un service WCF, j'ai:
ApptVisitLinkInfo est défini simplement:
Lorsque "Field2" est renvoyé en tant que Json à partir du service, la valeur est:
Notez le décalage de fuseau horaire inclus dans la valeur.
Le regex modifié:
Il est légèrement plus impatient et saisit tout entre les parens, pas seulement le premier numéro. L'heure résultante sinze 1970, plus le décalage de fuseau horaire peuvent tous être introduits dans l'éval pour obtenir un objet date.
La ligne résultante de JavaScript pour le remplacement est:
la source
Ne vous répétez pas - automatisez la conversion de date en utilisant
$.parseJSON()
Les réponses à votre message fournissent une conversion manuelle des dates en dates JavaScript. J'ai étendu
$.parseJSON()
un peu jQuery , il est donc capable d'analyser automatiquement les dates lorsque vous le lui demandez. Il traite les dates formatées ASP.NET (/Date(12348721342)/
) ainsi que les dates formatées ISO (2010-01-01T12.34.56.789Z
) qui sont prises en charge par les fonctions natives JSON dans les navigateurs (et les bibliothèques comme json2.js).En tous cas. Si vous ne voulez pas répéter votre code de conversion de date encore et encore, je vous suggère de lire ce billet de blog et d'obtenir le code qui vous facilitera la vie.
la source
Si vous dites en JavaScript,
vous verrez que c'est la bonne date, et vous pouvez l'utiliser n'importe où dans le code JavaScript avec n'importe quel framework.
la source
Cliquez ici pour voir la démo
JavaScript / jQuery
Résultat - "15/10/2008"
la source
Mise à jour
Nous avons une bibliothèque d'interface utilisateur interne qui doit faire face au format JSON intégré ASP.NET de Microsoft, comme
/Date(msecs)/
, demandé ici à l'origine, et à la plupart des formats de date de JSON, y compris JSON.NET, comme2014-06-22T00:00:00.0
. De plus, nous devons faire face à l'incapacité de oldIE de faire face à tout sauf à 3 décimales .Nous détectons d'abord le type de date que nous consommons, analysons-le dans un
Date
objet JavaScript normal , puis formatez-le.1) Détecter le format de date Microsoft
2) Détecter le format de date ISO
3) Analyser le format de date MS:
4) Analyser le format de date ISO.
Nous avons au moins un moyen de nous assurer que nous avons affaire à des dates ISO standard ou à des dates ISO modifiées pour toujours avoir trois millisecondes ( voir ci-dessus ), donc le code est différent selon l'environnement.
4a) Analyser le format de date ISO standard, faire face aux problèmes de oldIE:
4b) Analyser le format ISO avec une décimale fixe de trois millisecondes - beaucoup plus facile:
5) Formatez-le:
6) Attachez tout ensemble:
L'ancienne réponse ci-dessous est utile pour lier cette mise en forme de date à l'analyse JSON de jQuery afin d'obtenir des objets Date au lieu de chaînes, ou si vous êtes toujours bloqué dans jQuery <1.5 d'une manière ou d'une autre.
Ancienne réponse
Si vous utilisez la fonction Ajax de jQuery 1.4 avec ASP.NET MVC, vous pouvez transformer toutes les propriétés DateTime en objets Date avec:
Dans jQuery 1.5, vous pouvez éviter de remplacer la
parseJSON
méthode globalement en utilisant l'option converters dans l'appel Ajax.http://api.jquery.com/jQuery.ajax/
Malheureusement, vous devez passer à l'ancienne route eval pour que les dates soient analysées globalement sur place - sinon vous devez les convertir au cas par cas après l'analyse.
la source
Il n'y a pas de type de date intégré dans JSON . Cela ressemble au nombre de secondes / millisecondes d'une époque. Si vous connaissez l'époque, vous pouvez créer la date en ajoutant la bonne quantité de temps.
la source
J'ai également dû chercher une solution à ce problème et j'ai finalement trouvé moment.js qui est une belle bibliothèque qui peut analyser ce format de date et bien d'autres.
Cela m'a sauvé des maux de tête, alors j'ai pensé que je partagerais avec vous. :)
Vous pouvez trouver plus d'informations à ce sujet ici: http://momentjs.com/
la source
J'ai fini par ajouter les "caractères dans l'expression régulière de Panos pour se débarrasser de ceux générés par le sérialiseur Microsoft lors de l'écriture d'objets dans un script en ligne:
Donc, si vous avez une propriété dans votre code C -behind, c'est quelque chose comme
Et dans votre aspx vous avez
Vous obtiendriez quelque chose comme
Remarquez les guillemets doubles.
Pour obtenir ceci dans un formulaire que eval désérialisera correctement, j'ai utilisé:
J'utilise Prototype et pour l'utiliser j'ai ajouté
la source
Dans jQuery 1.5, tant que vous avez json2.js à couvrir pour les anciens navigateurs, vous pouvez désérialiser toutes les dates provenant d'Ajax comme suit:
J'ai inclus une logique qui suppose que vous envoyez toutes les dates du serveur en UTC (ce que vous devriez); le consommateur obtient alors un
Date
objet JavaScript qui a la valeur de ticks appropriée pour refléter cela. C'est-à-dire que l'appelgetUTCHours()
, etc. à la date retournera la même valeur que sur le serveur, et l'appelgetHours()
retournera la valeur dans le fuseau horaire local de l'utilisateur tel que déterminé par son navigateur.Cela ne prend pas en compte le format WCF avec les décalages de fuseau horaire, bien que ce soit relativement facile à ajouter.
la source
Utiliser le sélecteur de date jQuery UI - n'a de sens que si vous incluez déjà jQuery UI:
production:
la source
Ne pensez pas trop à cela. Comme nous l'avons fait depuis des décennies, passez un décalage numérique par rapport à l'époque standard de facto du 1er janvier 1970 à minuit GMT / UTC / & c en nombre de secondes (ou millisecondes) depuis cette époque. JavaScript l'aime, Java l'aime, C l'aime et Internet l'aime.
la source
Chacune de ces réponses a une chose en commun: elles stockent toutes les dates sous la forme d'une seule valeur (généralement une chaîne).
Une autre option consiste à tirer parti de la structure inhérente de JSON et à représenter une date sous forme de liste de nombres:
Bien sûr, vous devez vous assurer que les deux extrémités de la conversation s'accordent sur le format (année, mois, jour), et quels champs sont censés être des dates, ... mais cela a l'avantage d'éviter complètement le problème de la date conversion en chaîne. Ce sont tous des chiffres - pas de chaînes du tout. De plus, l'utilisation de la commande: année, mois, jour permet également un tri correct par date.
Penser juste en dehors de la boîte ici - une date JSON ne doit pas être stockée sous forme de chaîne.
Un autre avantage de le faire de cette façon est que vous pouvez facilement (et efficacement) sélectionner tous les enregistrements pour une année ou un mois donné en tirant parti de la façon dont CouchDB gère les requêtes sur les valeurs de tableau.
la source
Publication dans un fil génial:
la source
Juste pour ajouter une autre approche ici, «l'approche des tiques» que WCF adopte est sujette à des problèmes avec les fuseaux horaires si vous n'êtes pas extrêmement prudent comme décrit ici et ailleurs. J'utilise donc maintenant le format ISO 8601 que les deux .NET et JavaScript prennent dûment en charge, y compris les décalages de fuseau horaire. Voici les détails:
Dans WCF / .NET:
Où CreationDate est un System.DateTime; ToString ("o") utilise le spécificateur de format aller-retour de .NET qui génère une chaîne de date conforme à ISO 8601
En JavaScript
Juste après avoir récupéré le JSON, je corrige les dates pour être des objets Date JavaSript en utilisant le constructeur Date qui accepte une chaîne de date ISO 8601 ...
Une fois que vous avez une date JavaScript, vous pouvez utiliser toutes les méthodes de date pratiques et fiables comme toDateString , toLocaleString , etc.
la source
Existe-t-il une autre option sans utiliser la bibliothèque jQuery?
la source
Cela peut également vous aider.
la source
Voici une solution assez simple pour analyser les dates JSON. Utilisez les fonctions ci-dessous selon vos besoins. Il vous suffit de passer le format JSON Date récupéré en paramètre aux fonctions ci-dessous:
la source
Vous pouvez également utiliser la bibliothèque JavaScript moment.js , qui est utile lorsque vous prévoyez de traiter différents formats localisés et d'effectuer d'autres opérations avec des valeurs de dates:
Mettre en place la localisation est aussi simple que d'ajouter des fichiers de configuration (vous les obtenez sur momentjs.com) à votre projet et de configurer la langue:
la source
Je reçois la date comme ceci:
Dans certains exemples, la date est dans des formats légèrement différents:
etc.
J'ai donc créé le RegExp suivant:
et le code final est:
J'espère que cela aide.
Mise à jour: j'ai trouvé ce lien de Microsoft: comment sérialiser des dates avec JSON?
Cela ressemble à celui que nous recherchons tous.
la source
Vérifiez la norme ISO de date; un peu comme ça:
Cela devient
2008.11.20T22:18
.la source
C'est frustrant. Ma solution a été d'analyser le "/ et /" de la valeur générée par JavaScriptSerializer d'ASP.NET afin que, bien que JSON n'ait pas de littéral de date, il est toujours interprété par le navigateur comme une date, ce qui est tout ce que j'ai vraiment vouloir:
{"myDate":Date(123456789)}
Convertisseur JavaScript personnalisé pour DateTime?
Je dois souligner l'exactitude du commentaire de Roy Tinker. Ce n'est pas du JSON légal. C'est un hack sale et sale sur le serveur pour supprimer le problème avant qu'il ne devienne un problème pour JavaScript. Cela va étouffer un analyseur JSON. Je l'ai utilisé pour décoller, mais je ne l'utilise plus. Cependant, je pense toujours que la meilleure réponse réside dans le changement de la façon dont le serveur formate la date, par exemple, ISO, comme mentionné ailleurs.
la source
Un post tardif, mais pour ceux qui ont cherché ce post.
Imagine ça:
Comme vous pouvez le voir, j'utilise la fonctionnalité de C # 3.0 pour créer les génériques "Auto". C'est un peu paresseux, mais j'aime ça et ça marche. Juste une note: Profile est une classe personnalisée que j'ai créée pour mon projet d'application web.
la source
Pour info, pour toute personne utilisant Python côté serveur: datetime.datetime (). Ctime () retourne une chaîne qui est nativement analysable par "new Date ()". Autrement dit, si vous créez une nouvelle instance datetime.datetime (comme avec datetime.datetime.now), la chaîne peut être incluse dans la chaîne JSON, puis cette chaîne peut être transmise en tant que premier argument au constructeur Date. Je n'ai pas encore trouvé d'exceptions, mais je ne l'ai pas testé trop rigoureusement non plus.
la source
Solution Mootools:
Nécessite mootools-more. Testé avec mootools-1.2.3.1-more sur Firefox 3.6.3 et IE 7.0.5730.13
la source
la source
Ajoutez le plugin jQuery UI dans votre page:
la source
Et si .NET revient ...
Et puis en JavaScript ...
la source