8
votes

Date de JavaScript (Daturging) renvoie Nan sur un serveur et un navigateur spécifiques

J'utilise le constructeur de date JavaScript (String) avec un format de date de "AAAA-MM-DD". Le constructeur fonctionne simplement bien dans IE 9 et Firefox à moins que l'application s'exécute sur notre VM de test qui exécute IIS. Si c'est sur la machine virtuelle, il renvoie «Nan», mais travaille toujours normalement dans Firefox. XXX

J'étais sous l'hypothèse que le serveur n'avait rien à voir avec JavaScript côté client . Toute suggestion?


4 commentaires

Assurez-vous que le serveur n'a rien à voir avec JavaScript côté client au fur et à mesure que le client (la personne qui visite le site) exécute ce code, pas le serveur.


@jakx je sais, c'est pourquoi je suis confondu par cela.


Vérifiez le mode Document dans les outils de développement IE (F12) sur les deux serveurs. Je soupçonne qu'ils diffèrent.


@Phrogz gagne! Merci. Maintenant je peux dormir ce soir!


4 Réponses :


2
votes

Je suggère de tenter une forme de date plus fiable. L'exemple ci-dessous utilise optimiste () code>. Est-ce que c'est-à-dire un résultat différent avec le code ci-dessous?

/**Parses string formatted as YYYY-MM-DD to a Date object.
   * If the supplied string does not match the format, an 
   * invalid Date (value NaN) is returned.
   * @param {string} dateStringInRange format YYYY-MM-DD, with year in
   * range of 0000-9999, inclusive.
   * @return {Date} Date object representing the string.
   */
  function parseISO8601(dateStringInRange) {
    var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/,
        date = new Date(NaN), month,
        parts = isoExp.exec(dateStringInRange);

    if(parts) {
      month = +parts[2];
      date.setFullYear(parts[1], month - 1, parts[3]);
      if(month != date.getMonth() + 1) {
        date.setTime(NaN);
      }
    }
    return date;
  }


2 commentaires

Ça a marché. Cela me déflore encore. Le serveur servant que le JS n'aurait pas d'importance d'avoir d'importance? Mon code a travaillé dans IE quand je l'ai rencontré sur Localhost.


J'ai eu une date qui incluait également l'heure et la zone (seulement besoin de la date). J'ai édité votre regex sur la ligne 2 et supprimé la fois le ^ et $ de celui-ci. Sinon, travaillé comme un charme.



3
votes

C'est à cause du format de date. Pour une raison quelconque, c'est-à-dire et safari est trébuché avec AAAAYY-MM-DD . Utilisez un autre format de date et vous devriez être défini.

On parle ici:
http://biostall.com / JavaScript-New-Date-retour-Nan-in-Ie-ou non valide-date-in-safari


6 commentaires

Mais, le vrai problème est que cela fonctionne dans IE lorsque j'exécute l'application sur mon localhost (Visual Studio Server). Cela ne fonctionne pas dans IE quand c'est sur un autre serveur.


L'autre serveur a-t-il une version différente de IE installé?


Nope, deux onglets différents ouverts dans la même chose, c'est-à-dire 9. idem code JS, comportement différent.


@ Aperçu: utilisez-vous localhost ou avez-vous un nom de domaine plus réaliste, par exemple dev.example.com . IE peut agir différemment en fonction de la zone qu'il associe le site avec (approuvé / intranet / Internet / non conçu / mon ordinateur).


@Leekowalkowski qui aurait un sens, mais il s'avère que "le mode de document" dans IE9 a été défini sur IE7 pour l'un des serveurs.


Il peut être frustrant que, c'est-à-dire, c'est-à-dire que cela semble faire différentes choses sur le serveur vs certains clients, mais essentiellement, il n'est pas pertinent. Comme cela ne fonctionne pas correctement dans toutes les circonstances raisonnables, vous avez besoin d'une solution de contournement.



8
votes

Utilisez simplement des barres obliques au lieu d'un trait d'union si vous le pouvez.


EDIT: Clarification étendue ...

Le ISO 8601 Le format standard utilise le trait d'union comme séparateur de date. Ma réponse ne signifie pas que vous n'avez pas besoin de suivre des normes. Vous pouvez utiliser des barres obliques uniquement pour le constructeur de date si nécessaire.


2 commentaires

Cela semble certainement attrayant. Pouvez-vous confirmer que tous les autres navigateurs principaux prennent également en charge le format SLASH séparé?


Fonctionne comme un charme! :-)



9
votes

Et pour ceux d'entre nous qui veulent savoir comment em> pour remplacer des traits d'union (aka tirets) avec des barres obliques: xxx pré>

qui utilise cette fonction: p>

function dashToSlash(string){
  var response = string.replace(/-/g,"/");
  //The slash-g bit says: do this more than once
  return response;
}


1 commentaires

Vous devez vraiment définir une variable de «réponse» distincte et attribuer la valeur du résultat de l'opération Remplacer. Si vous ne le faites pas, la chaîne est renvoyée non altérée dans Chrome. Quoi?