toLocaleDateString () cambios en IE11


En IE 11, estoy obteniendo resultados divertidos con toLocaleDateString(). La cadena devuelta se ve bien en el navegador, por ejemplo, "1/28/2014 11:00:46 AM", pero luego si copio y pego ese valor en un editor de texto sin formato, se ve así: "?1?/?28?/?2014 ?11?:?00?:?46? ?SER".

Curiosamente, si pego el texto en un producto de Microsoft, se ve bien... El problema es que si intenta usar el valor mediante programación para crear una fecha, no es válido. Usted puede probar esto con solo abrir un consola en IE11 y creando una nueva fecha, usando toLocaleDateString () en ella, y luego tratando de usar la cadena resultante para crear una nueva fecha en javascript o en el idioma de su elección (estoy usando ASP.NET toma...).

¿Estoy haciendo algo mal, o hay alguna otra forma en que se supone que debo interactuar con la fecha de javascript? ¿Cómo puedo deshacerme de esos símbolos funky?

Editar: Gracias al comentario a continuación pude averiguar cuáles son los personajes no mostrados, son marcas de izquierda A derecha. Dependiendo del editor en el que pegue los valores y la codificación que el editor esté configurado para usar, el texto se mostrará de manera diferente: a veces con"?"a veces sin.

Author: ctb, 2014-01-28

5 answers

El problema es que si intenta usar el valor mediante programación para crear una fecha, no es válido.

...

¿Estoy haciendo algo mal, o hay alguna otra forma en que se supone que debo interactuar con la fecha de javascript?

Sí, lo estás haciendo mal. No debería usar una función destinada a formatear algo para la visualización humana específica de la configuración regional y esperar que la salida sea parsable por máquina. Cualquiera de la salida de toLocaleString, toLocaleDateString, o toLocaleTimeString son solo para visualización legible por humanos. (Como Bergi aclaró en los comentarios, toString también está destinado a la exhibición humana, pero ECMA §15.9.4.2 dice que debe ser de ida y vuelta)

Es probable que obtenga los marcadores LTR porque su configuración regional de visualización es RTL. Además de esto, considere que la configuración regional siempre afectará la salida. Tal vez su configuración regional utilice el formato dd/mm/aaaa en lugar del formato mm/dd/aaaa. O tal vez su configuración regional requiere caracteres asiáticos o árabes. Estos son todos consideraciones al determinar un formato de visualización, pero nunca son apropiadas para el análisis de máquina.

También considere que la especificación ECMAScript no define ninguna regla de formato particular para la salida de estos métodos, y los diferentes navegadores producirán resultados diferentes.

Si la intención es otra cosa que mostrar al usuario, entonces usted debe utilizar una de estas funciones en su lugar:

  • toISOString le dará un formato ISO8601 / RFC3339 marca de tiempo
  • toGMTString o toUTCString le dará una marca de tiempo con formato RFC822/RFC1123
  • getTime le dará una marca de tiempo Unix entera con precisión de milisegundos

Todo lo anterior devolverá un valor basado en UTC. Si desea la hora local, puede construir su propia cadena con las diversas funciones de acceso(getFullYear, getMonth, etc...), o puede usar una biblioteca como moment.js :

Esto usa el momento.js para devolver un local con formato ISO8601 tiempo + desplazamiento desde una fecha:

moment(theDate).format()   // ex:  "2014-08-14T13:32:21-07:00"
 20
Author: Matt Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-15 00:40:57

Arreglé eso con lo siguiente replace(/[^ -~]/g,'') como en

(new Date("7/15/2014").toLocaleString().replace(/[^ -~]/g,'')
 30
Author: vldmrrr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-17 16:55:43
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;
}

Solo devuelve dígitos y el carácter/. Parece que esto funciona:

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

Devuelve la fecha correcta. Sin la llamada a FixLocaleDateString (), el resultado sería una fecha no válida.

 3
Author: Evan Machusak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-21 20:34:59

Para completar, formulario de respuesta:

En mi sistema, es decir, el método del objeto Date de 11 toLocaleDateString resulta en "7/6/2014" cuando se ejecuta en la consola, que se representa como los siguientes bytes:

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"|

Los no imprimibles son 0xe2 0x80 0x8e a lo largo de los cuales está la representación UTF-8 del Punto de Código Unicode U+200E. Que es, como dicen los comentarios anteriores, la MARCA DE IZQUIERDA A DERECHA.

Este JSFiddle no parece tener problemas para usar el valor devuelto desde toLocaleDateString() para volver a un fecha. Al menos en mi IE 11.0.9600.17239 con la versión de actualización 11.0.11 (KB2976627). Así que tal vez sólo la consola añade los personajes adicionales?

 3
Author: opello,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-14 20:12:56
var startDateConverted = new Date(start).toLocaleString().replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')

Si también desea eliminar el uso del tiempo .split(' ').slice(0, -1).join(' ');

 0
Author: nikunjM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-15 23:24:26