Diferença entre Date (dateString) e new Date (dateString)

Eu tenho um código que tenta analisar uma string de data.

Quando eu faço alert(Date("2010-08-17 12:09:36")); Analisa adequadamente a data e tudo funciona bem, mas não consigo chamar os methods associados a Date , como getMonth() .

Quando eu tento:

 var temp = new Date("2010-08-17 12:09:36"); alert(temp); 

Recebo um erro de “data inválida”.

Alguma idéia de como analisar “2010-08-17 12:09:36” com a nova data ()?

Encontro()

Com isso, você chama uma function chamada Date() . Não aceita argumentos e retorna uma string representando a data e a hora atuais.

Nova data()

Com isso você está criando uma nova instância de data.

Você pode usar apenas os seguintes construtores:

 new Date() // current date and time new Date(milliseconds) //milliseconds since 1970/01/01 new Date(dateString) new Date(year, month, day, hours, minutes, seconds, milliseconds) 

Então, use 2010-08-17 12:09:36 como parâmetro para o construtor não é permitido.

Veja w3schools .


EDIT: new Date(dateString) usa um destes formatos:

  • “13 de outubro de 1975 11:13:00”
  • “13 de outubro de 1975 11:13”
  • “13 de outubro de 1975”

O formato a seguir funciona em todos os navegadores:

 new Date("2010/08/17 12:09:36"); 

Portanto, para tornar uma string de data formatada em formato yyyy-mm-dd hh:mm:ss totalmente compatível com navegador, você teria que replace traços por barras:

 var dateString = "2010-08-17 12:09:36"; new Date(dateString.replace(/-/g, "/")); 

Eu sei que isso é velho, mas de longe a solução mais fácil é apenas usar

 var temp = new Date("2010-08-17T12:09:36"); 

A diferença é o fato (se me lembro da documentação do ECMA) é que a Date("xx") não cria (em certo sentido) um novo object de data (na verdade, equivale a chamar ( new Date("xx").toString() ) Enquanto new Date("xx") irá criar um novo object de data.

Para maiores informações:

Veja em 15.9.2 de http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf

Alguma idéia de como analisar “2010-08-17 12:09:36” com a nova data ()?

Até o ES5, não havia nenhum formato de string que os navegadores precisassem suportar, embora haja um número amplamente suportado. No entanto, o suporte ao navegador não é confiável, um inconsistente, por exemplo, alguns permitirão valores fora dos limites e outros não, alguns suportam determinados formatos e outros não, etc.

O ES5 introduziu suporte para alguns formatos ISO 8601, no entanto, o OP não é compatível com o ISO 8601 e nem todos os navegadores em uso o suportam de qualquer maneira.

A única maneira confiável é usar uma pequena function de análise. A seguir analisa o formato no OP e também valida os valores.

 /* Parse date string in format yyyy-mm-dd hh:mm:ss ** If string contains out of bounds values, an invalid date is returned ** ** @param {string} s - string to parse, eg "2010-08-17 12:09:36" ** treated as "local" date and time ** @returns {Date} - Date instance created from parsed string */ function parseDateString(s) { var b = s.split(/\D/); var d = new Date(b[0], --b[1], b[2], b[3], b[4], b[5]); return d && d.getMonth() == b[1] && d.getHours() == b[3] && d.getMinutes() == b[4]? d : new Date(NaN); } document.write( parseDateString('2010-08-17 12:09:36') + '
' + // Valid values parseDateString('2010-08-45 12:09:36') // Out of bounds date );

Maneiras corretas de usar Data: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date

Além disso, o seguinte trecho de código mostra como, com uma única definição da function “Animal”, ele pode ser a) chamado diretamente eb) instanciado tratando-o como uma function construtora

 function Animal(){ this.abc = 1; return 1234; } var x = new Animal(); var y = Animal(); console.log(x); //prints object containing property abc set to value 1 console.log(y); // prints 1234 

Você não está recebendo um erro de “data inválida”. Em vez disso, o valor de temp é “Data Inválida”.

Sua sequência de datas está em um formato válido? Se você estiver usando o Firefox, confira Date.parse

No console de javascript do Firefox:

 >>> Date.parse("2010-08-17 12:09:36"); NaN >>> Date.parse("Aug 9, 1995") 807944400000 

Eu tentaria um formato de seqüência de data diferente.

Zebi, você está usando o Internet Explorer?

Eu estava tendo o mesmo problema usando uma chamada de API que respondia no formato ISO 8601. Trabalhando no Chrome isso funcionou: `

 // date variable from an api all in ISO 8601 format yyyy-mm-dd hh:mm:ss var date = oDate['events']['event'][0]['start_time']; var eventDate = new Date(); var outputDate = eventDate.toDateString(); 

`

mas isso não funcionou com o firefox.

A resposta acima me ajudou a formatá-lo corretamente para o firefox:

  // date variable from an api all in ISO 8601 format yyyy-mm-dd hh:mm:ss var date = oDate['events']['event'][0]['start_time']; var eventDate = new Date(date.replace(/-/g,"/"); var outputDate = eventDate.toDateString(); 

Eu recentemente encontrei isso também e este foi um post útil. Eu levei o Topera acima um passo adiante e isso funciona para mim tanto no Chrome quanto no Firefox:

 var temp = new Date( Date("2010-08-17 12:09:36") ); alert(temp); 

a chamada interna para Date() retorna uma string que a new Date() pode analisar.