web-dev-qa-db-fra.com

ToLocaleDateString () modifications dans IE11

Dans IE 11, j'obtiens des résultats amusants avec ToLocaleDateString (). La chaîne renvoyée est correcte dans le navigateur, par exemple. "28/01/2014 11:00:46", mais ensuite, si je copie et colle cette valeur dans un éditeur de texte, elle se présente comme suit: "? 1? /? 28? /? 2014? 11?:? 00?:? 46?? AM ".

Fait intéressant, si je colle le texte dans un produit Microsoft, tout se passe bien ... Le problème est que si vous essayez d'utiliser la valeur par programmation pour créer une date, elle n'est pas valide. Vous pouvez tester cela en ouvrant simplement une console dans IE11 et en créant une nouvelle date, en utilisant ToLocaleDateString () dessus, puis en essayant d'utiliser la chaîne résultante pour créer une nouvelle date en javascript ou dans la langue de votre choix (I ' m en utilisant ASP.NET ici ...).

Est-ce que je fais quelque chose de mal ou y a-t-il un autre moyen par lequel je suis censé interagir avec la date javascript? Comment puis-je me débarrasser de ces symboles géniaux?

Edit: Grâce au commentaire ci-dessous, j'ai pu comprendre quels sont les caractères non représentés, ce sont des marques de gauche à droite. Selon l'éditeur où je colle les valeurs et l'encodage que l'éditeur est configuré pour utiliser, le texte s'affichera différemment: parfois avec "?", Parfois sans.

42
ctb

Le problème est que si vous essayez d'utiliser la valeur par programme pour créer une date, elle n'est pas valide. 

...

Est-ce que je fais quelque chose de mal ou y a-t-il un autre moyen par lequel je suis censé interagir avec la date javascript?

Oui, vous le faites mal. Vous ne devriez pas utiliser une fonction destinée à formater quelque chose pour un affichage humain spécifique à l'environnement local et s'attendre à ce que le résultat soit analysable par la machine. Les sorties toLocaleString, toLocaleDateString ou toLocaleTimeString sont uniquement destinées à un affichage lisible par l'homme. (Comme Bergi l'a précisé dans les commentaires, toString est également destiné à l'affichage humain, mais ECMA §15.9.4.2 dit qu'il devrait aller-retour)

Vous obtiendrez probablement les marqueurs LTR car vos paramètres régionaux d’affichage sont RTL. En outre, considérez que les paramètres régionaux affecteront toujours la sortie. Peut-être que vos paramètres régionaux utilisent le formatage jj/mm/aaaa au lieu du formatage mm/jj/aaaa. Ou peut-être que votre région requiert des caractères asiatiques ou arabes. Toutes ces considérations sont à prendre en compte lors de la détermination d'un format d'affichage, mais ne sont jamais appropriées pour l'analyse de la machine.

Notez également que la spécification ECMAScript ne définit aucune règle de mise en forme particulière pour la sortie de ces méthodes, et que différents navigateurs donneront des résultats différents.

Si l'intention est autre chose que d'afficher à l'utilisateur, vous devriez alors utiliser l'une de ces fonctions:

  • toISOString vous donnera un horodatage au format ISO8601/RFC3339
  • toGMTString ou toUTCString vous donnera un horodatage au format RFC822/RFC1123
  • getTime vous donnera un timestamp Unix entier avec une précision à la milliseconde

Toutes les réponses ci-dessus renverront une valeur UTC. Si vous voulez l'heure locale, vous pouvez soit créer votre propre chaîne avec les différentes fonctions d'accès (getFullYear, getMonth, etc ...), ou vous pouvez utiliser une bibliothèque telle que moment.js :

Ceci utilise moment.js pour renvoyer une heure locale au format ISO8601 + décalage par rapport à une date:

moment(theDate).format()   // ex:  "2014-08-14T13:32:21-07:00"
23
Matt Johnson

J'ai corrigé cela avec le replace(/[^ -~]/g,'') suivant comme dans

(new Date("7/15/2014").toLocaleString().replace(/[^ -~]/g,'')
33
vldmrrr

Pour être complet, répondez au formulaire:

Sur mon système, IE La méthode toLocaleDateString de l'objet Date de 11 génère "7/6/2014" lorsqu'elle est exécutée dans la console, représentée par les octets suivants:

 00000000 22 e2 80 8e 37 e2 80 8e 2f e2 80 8e 36 e2 80 8e | "â.Z7âZ/â.Z6â.Z | 
 00000010 2f e2 80 8e 32 30 31 34 22 |/â .Z2014 "| 

Les non-imprimables sont 0xe2 0x80 0x8e dans tout ce qui correspond à la représentation UTF-8 de Point de code Unicode U + 200E . Comme le disent les commentaires ci-dessus, il s’agit de la marque LEFT-TO-DROIGHT.

Ce JSFiddle ne semble pas avoir de difficulté à utiliser la valeur renvoyée par toLocaleDateString() pour revenir à une date. Au moins dans my IE 11.0.9600.17239 avec la version de mise à jour 11.0.11 (KB2976627). Alors peut-être que seule la console ajoute les caractères supplémentaires?

3
opello
function FixLocaleDateString(localeDate) {
    var newStr = "";
    for (var i = 0; i < localeDate.length; i++) {
        var code = localeDate.charCodeAt(i);
        if (code >= 47 && code <= 57) {
            newStr += localeDate.charAt(i);
        }
    }
    return newStr;
}

Renvoie uniquement les chiffres et le caractère /. Semble faire ce travail:

new Date(FixLocaleDateString(new Date("7/15/2014").toLocaleString()));

Renvoie la date correcte. Sans l'appel à FixLocaleDateString (), le résultat serait une date non valide.

3
Evan Machusak
var startDateConverted = new Date(start).toLocaleString().replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')

si vous souhaitez également supprimer le temps, utilisez .split(' ').slice(0, -1).join(' ');

0
nikunjM