ToLocaleDateString () alterações no IE11

No IE 11, estou obtendo resultados engraçados com ToLocaleDateString (). A string retornada parece bem no navegador, por exemplo, “1/28/2014 11:00:46 AM”, mas se eu copiar e colar esse valor em um editor de texto simples, será semelhante a: “? 1? /? 28? /? 2014? 11?:? 00?:? 46? AM “.

Curiosamente, se eu colar o texto em um produto da Microsoft, parece bem … O problema é que, se você tentar usar o valor programaticamente para criar uma data, ele será inválido. Você pode testar isso apenas abrindo um console no IE11 e criando uma nova data, usando ToLocaleDateString (), e então tentando usar a string resultante para criar uma nova data em javascript ou no idioma de sua escolha (eu m usando o asp.net aqui …).

Estou fazendo algo errado, ou há alguma outra maneira que eu deveria estar interagindo com a data de javascript? Como posso me livrar desses símbolos funky?

Edit: Graças ao comentário abaixo, eu fui capaz de descobrir quais são os caracteres não mostrados, são marcas da esquerda para a direita. Dependendo do editor em que colei os valores e a codificação que o editor está configurado para usar, o texto será exibido de forma diferente: às vezes com “?”, Às vezes sem.

O problema é que, se você tentar usar o valor programaticamente para criar uma data, ele será inválido.

Estou fazendo algo errado, ou há alguma outra maneira que eu deveria estar interagindo com a data de javascript?

Sim, você está fazendo errado. Você não deveria estar usando uma function destinada a formatar algo para exibição humana específica de localidade e esperar que a saída seja analisável por máquina. Qualquer saída de toLocaleString , toLocaleDateString ou toLocaleTimeString é destinada apenas para exibição legível por humanos. (Como Bergi esclareceu nos comentários, toString também foi feito para exibição humana, mas a ECMA §15.9.4.2 diz que deve ser de ida e volta)

Você provavelmente está obtendo os marcadores LTR porque sua localidade de exibição é RTL. Além disso, considere que o local sempre afetará a saída. Talvez sua localidade use formatação dd / mm / aaaa em vez de formatação mm / dd / aaaa. Ou talvez sua localidade exija caracteres asiáticos ou árabes. Essas são todas as considerações ao determinar um formato de exibição, mas nunca são apropriadas para análise de máquina.

Considere também que a especificação ECMAScript não define nenhuma regra de formatação específica para a saída desses methods, e diferentes navegadores produzirão resultados diferentes.

Se a intenção for diferente de exibir ao usuário, você deverá usar uma dessas funções:

  • toISOString lhe dará um registro de data e hora formatado no formato ISO8601 / RFC3339
  • toGMTString ou toUTCString lhe dará um timestamp formatado em RFC822 / RFC1123
  • getTime dará a você um registro de data e hora Unix inteiro com precisão de milissegundos

Todos os itens acima retornarão um valor baseado em UTC. Se você quer a hora local, você pode construir sua própria string com as várias funções getFullYear ( getFullYear , getMonth , etc …), ou você pode usar uma biblioteca como moment.js :

Isso usa moment.js para retornar um horário local com formato ISO8601 + deslocamento de uma data:

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

Eu consertei isso com o seguinte replace(/[^ -~]/g,'') como em

 (new Date("7/15/2014").toLocaleString().replace(/[^ -~]/g,'') 
 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; } 

Apenas retorna dígitos e o caractere /. Parece fazer este trabalho:

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

Retorna a data correta. Sem a chamada para FixLocaleDateString (), o resultado seria uma data inválida.

Para preenchimento, formulário de resposta:

No meu sistema, o método do object Date do IE 11 toLocaleDateString resulta em "7/6/2014" quando executado no Console, que é representado como os seguintes 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 "|

Os não-imprimíveis são 0xe2 0x80 0x8e que é a representação UTF-8 do Unicode Code Point U + 200E . Que é, como dizem os comentários acima, a MARCA ESQUERDA-PARA-DIREITA.

Este JSFiddle não parece ter problemas para usar o valor retornado de toLocaleDateString() para retornar a uma data. Pelo menos no meu IE 11.0.9600.17239 com Update Version 11.0.11 (KB2976627). Então, talvez apenas o console adicione os caracteres extras?

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

se você também deseja remover o tempo use .split(' ').slice(0, -1).join(' ');