2009-07-02 8 views
5

Tengo una función de JavaScript que busca un rango de fechas. ¿Hay alguna manera de verificar si un usuario ha ingresado una fecha válida en un cuadro de texto, independientemente del formato?¿Cómo puedo verificar si el usuario pasa una fecha válida en javascript?

function checkEnteredDate() { 
      var inputDate = document.getElementById('txtDate'); 
      //if statement to check for valid date 
      var formatDate = new Date(inputDate.value); 
      if (formatDate > TodayDate) { 
       alert("You cannot select a date later than today."); 
       inputDate.value = TodayDate.format("MM/dd/yyyy"); 
      } 
} 

Respuesta

10

echar un vistazo a esta biblioteca date.js http://code.google.com/p/jqueryjs/source/browse/trunk/plugins/methods/date.js

tiene una función útil llamada fromstring que tratar de convertir una cadena (basado en Date.format) a un objeto de fecha válido.

la función devuelve falso si no crea un objeto de fecha válido; puede probar con un formato diferente antes de renunciar si todos devuelven falso.

aquí están algunos formatos ejemplo, usted podría poner a prueba para:

Date.format = 'dd mmm yyyy'; 
alert(Date.fromString("26 Jun 2009")); 

Date.format = 'mmm dd yyyy'; 
alert(Date.fromString("Jun 26 2009")); 

Date.format = 'dd/mm/yy'; 
alert(Date.fromString("26/06/09")); 

Date.format = 'mm/dd/yy'; 
alert(Date.fromString("06/26/09")); 

Date.format = 'yyyy-mm-dd'; 
alert(Date.fromString("2009-06-26")); 

Josh

+0

A menos que el usuario especifique el formato, aún tendrá el problema de ambigüedad de Europa/EE. UU. –

+0

@Matt - correcto - la única solución para esto es probar si los días o los meses son mayores que 12 - si no tiene que devolver que la fecha es ambigua y deben usar dd/mm/aaaa – Josh

2

independientemente del formato?

que va a ser complicado ...

  • 2009/07/02 es una fecha válida
  • 02/07/09 También
  • 2-7-09 también
  • 02-7 -'09 también
  • la segunda de julio de 2009 -> también válida
  • twee tweeduizend Juli en negen -> también válida (holandés)

Todos son válidos, pero todos tienen un formato diferente. Por lo tanto, independientemente del formato ... Tengo serias dudas de que ...

1

Puede expresión regular o un código de encargo. Ejemplo a continuación:

function isValidDate(dateStr, format) { 
    if (format == null) { format = "MDY"; } 
    format = format.toUpperCase(); 
    if (format.length != 3) { format = "MDY"; } 
    if ((format.indexOf("M") == -1) || (format.indexOf("D") == -1) || _ 
     (format.indexOf("Y") == -1)) { format = "MDY"; } 
    if (format.substring(0, 1) == "Y") { // If the year is first 
     var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/ 
     var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/ 
    } else if (format.substring(1, 2) == "Y") { // If the year is second 
     var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/ 
     var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/ 
    } else { // The year must be third 
     var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/ 
     var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/ 
    } 
    // If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail 
    if ((reg1.test(dateStr) == false) && (reg2.test(dateStr) == false)) { return false; } 
    var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was 
    // Check to see if the 3 parts end up making a valid date 
    if (format.substring(0, 1) == "M") { var mm = parts[0]; } else _ 
     if (format.substring(1, 2) == "M") { var mm = parts[1]; } else { var mm = parts[2]; } 
    if (format.substring(0, 1) == "D") { var dd = parts[0]; } else _ 
     if (format.substring(1, 2) == "D") { var dd = parts[1]; } else { var dd = parts[2]; } 
    if (format.substring(0, 1) == "Y") { var yy = parts[0]; } else _ 
     if (format.substring(1, 2) == "Y") { var yy = parts[1]; } else { var yy = parts[2]; } 
    if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); } 
    if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); } 
    var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0); 
    if (parseFloat(dd) != dt.getDate()) { return false; } 
    if (parseFloat(mm)-1 != dt.getMonth()) { return false; } 
    return true; 
} 
4

Es un problema muy difícil de analizar fechas en un formato arbitrario (como señala @Natrium). Es aún más confuso si tenemos en cuenta que Europa escribe sus fechas como dd/mm/aaaa, por lo que no puede decir si el 7/02/09 es el 7 de febrero o el 2 de julio.

La mayoría de las personas abordan este problema utilizando un tipo de control datepicker de una biblioteca de JavaScript o usando cuadros desplegables con valores establecidos para el mes, el día y el año.

<select name="month"> 
<option value="1">January</option> 
<option value="2">February</option> 
... 
<option value="12">December</option> 
</select> 

<select name="day"> 
<option value="1">1</option> 
<option value="2">2</option> 
... 
<option value="31">31</option> 
</select> 

<select name="year"> 
<option value="2000">2000</option> 
<option value="2001">2001</option> 
... 
<option value="2009">2009</option> 
</select> 
+0

Usar selects es horrible solución. Ahora, en lugar de escribir "27" por día, necesito desplazarme hacia abajo por una lista completa de números: el menú desplegable se abrirá en un rectángulo estrecho y alto en la mayoría de las plataformas, lo cual es difícil de manejar.Por otro lado, tener controles basados ​​en no seleccionar aún lo somete al problema de análisis sintáctico. – levik

+1

En realidad, si selecciona el campo de selección y luego escribe "2", luego "7", elegirá "27" correctamente. (Probado usando Firefox). –

+0

+1 por un datepicker – jeroen

0

Me doy cuenta de que tengo que obtener una validación del código. Estas son todas buenas respuestas, pero empezaban a complicarse. No quería respaldarme en una esquina, así que elegí la ruta alternativa. Gracias

Cuestiones relacionadas