tolocalestring new invalid from fecha convertir javascript validation datetime safari

javascript - new - Safari JS no puede analizar el formato de fecha YYYY-MM-DD



string to date javascript (4)

En un proyecto en el que estoy trabajando, necesito validar una fecha ingresada en <input type="date">

Con Safari 4/5 (en Mac OSX) el Javascript no analiza las fechas del formato YYYY-MM-DD , devolviendo NaN lugar de la marca de tiempo de época esperada.

Estoy utilizando la siguiente técnica para validar el campo justo antes de enviar el formulario:

//value = ''2010-06-21'' var stamp = Date.parse(value); if (isNaN(stamp)) { //notify user } else { value = new Date(stamp).format_mysql(); }

Donde format_mysql() es una función prototipo que formatea la fecha (correctamente) en el formato de fecha y hora de MySQL (AAAA-MM-DD).

Reemplazar las - ''s con / '' (YYYY / MM / DD) produce una marca de tiempo "correcta".

Debo señalar que el campo debe aceptar cualquier formato de fecha, no solo YYYY-MM-DD, y que aunque me gustaría, no puedo usar bibliotecas como Date.js

¿Cómo puedo solucionar esto o hay una forma mejor de analizar / validar una fecha?


el campo debe aceptar cualquier formato de fecha

No te refieres a lo que piensas que quieres decir.

  • Es difícil distinguir de manera confiable entre M / D / Y (US) y D / M / Y (UK). DMY es más común en el Reino Unido, pero de ninguna manera universal.
  • Buena suerte con fechas anteriores a alrededor de 1600: el calendario gregoriano (solar) se introdujo en 1582, y se adoptó (casi universalmente) en el siglo XX (Wikipedia da 1929). El 30 de febrero fue una fecha válida en Suecia.
  • OS X le ofrece una opción de 13 (!) Calendarios, aunque el valor predeterminado es gregoriano.

En cambio, recomiendo usar un widget de calendario. Creo que JQuery tiene uno, pero ICBW.


El comportamiento del método Date.parse depende de la implementación, en ECMAScript 5, este método puede analizar las fechas con formato ISO8601, pero le recomendaría que realice el análisis sintáctico manualmente.

Hace algún tiempo hice una función simple, que puede manejar un argumento especificador de formato:

function parseDate(input, format) { format = format || ''yyyy-mm-dd''; // default format var parts = input.match(/(/d+)/g), i = 0, fmt = {}; // extract date-part indexes from the format format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = i++; }); return new Date(parts[fmt[''yyyy'']], parts[fmt[''mm'']]-1, parts[fmt[''dd'']]); } parseDate(''06.21.2010'', ''mm.dd.yyyy''); parseDate(''21.06.2010'', ''dd.mm.yyyy''); parseDate(''2010/06/21'', ''yyyy/mm/dd''); parseDate(''2010-06-21'');

También podría detectar el comportamiento de ECMAScript 5 para analizar las fechas formateadas con ISO, puede verificar si Date.prototype.toISOString está disponible, por ejemplo:

if (typeof Date.prototype.toISOString == "function") { // ES5 ISO date parsing available }


En general, el formato DD-MM-YYYY no es compatible en safari.

valor = 2010/06/21; //Deberia trabajar.

(o)

value = new Date (''2010-06-21''.replace (/ - / g, "/"));


Puede obtener una fecha no ambigua de la entrada, pero aún necesita verificarla, para que el usuario no le dé el 31 de abril.

<fieldset id= "localdate"> <select id= "monthselect" size= "1"> <option selected= "selected"> January</option> <option> February</option> <option> March</option> <option> April</option> <option> May</option> <option> June</option> <option> July</option> <option> August</option> <option> September</option> <option> October</option> <option> November</option> <option> December</option> </select> <label> Date: <input name= "inputdate" size= "2" value= "1"> </label> <label> Year: <input name= "inputyear" size= "4" value= "2010"> </label> </fieldset>

atajo para document.getElementsByName

función byNombre (s, n) {n = n || 0; return document.getElementsByName (s) [n]; }

function getDateInput(){ var day, y= parseInt(byName(''inputyear'').value), m= byName(''monthselect'').selectedIndex, d= parseInt(byName(''inputdate'').value); if(!y || y<1000 || y> 3000) throw ''Bad Year ''+y; if((!d || d<1 || d> 32) throw ''Bad Date ''+d; day= new Date(y,m,d); if(day.getDate()!= d) throw ''Bad Date ''+d; value= day.format_mysql(); }

puede preestablecer los campos para reflejar la fecha actual onload

onload= function(){ var now= new Date(); byName(''inputyear'').value= now.getFullYear(); byName(''monthselect'').selectedIndex= now.getMonth(); byName(''inputdate'').value= now.getDate(); }