2009-06-29 37 views
5

Necesito una expresión regular para validar una marca de tiempo del formato, usando Javascript:de expresiones regulares para validar una marca de tiempo

AAAA/MM/DD HH: MI: SS

I intenté cocinar un poco, pero parece que mis habilidades de expresión regular no cubren una cosa u otra.

Por favor dame una referencia o forma de hacerlo.

P.S. : Menciono regex, solo como una sugerencia. Estoy usando Javascript y doy la bienvenida a cualquier alternativa.

+7

2009/14/35 27:63:60 Es válido? Si no, va a ser feo con expresiones regulares. – balpha

+0

¿Qué idioma estás usando? Si se trata de Perl, puede invocar el código de la expresión regular, que es probablemente la única forma en que hará una verificación fácil de leer. Solo el código para validar si es un año bisiesto para validar si existe el 29 de febrero haría que todo fuera feo a medida que todos salgan. –

+0

menciono regex, solo como una sugerencia. Estoy usando Javascript y doy la bienvenida a cualquier alternativa. –

Respuesta

16

Recomendaría utilizar Datejs para esto. No es necesario analizar la fecha usted mismo y una Regex no es suficiente para validar una marca de tiempo. Con Datejs se podría analizar la cadena en una fecha y obtendrá un valor nulo si la nulidad de:

Date.parse("2009/06/29 13:30:10", "yyyy/MM/dd HH:mm:ss"); 
+0

¡Gracias! Hace lo que necesito –

0

estilo perl: [12] \ d {3}/[01] \ d/[0-3] \ d [0-2] \ d (? :: [0-5] \ d) { 2}

+0

Si no necesita segundos intercalares. –

5

Si lo que desea es validar la sintaxis, aquí es la expresión regular POSIX:

[0-9]{1,4}/[0-9]{1,2}/[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2} 

Pero si desea comprobar la semántica, que procesaría la cadena usando el idioma de su elección, hay demasiados casos que no puede cubrir con expresiones regulares (como años bisiestos/segundos, horario de verano, etc.)

+0

creo que sería mejor hacerlo como [0-9] {4,4}/[0-9] {2,2}/[0-9] {2,2} [0-9] { 2,2}: [0-9] {2,2}: [0-9] {2,2} –

+1

Según sus necesidades, sí. Pero puedes usar {x} en lugar de {x, x}. – soulmerge

0

Regular-Expressions.info es una buena fuente de en formación sobre RegEx, también tiene un buen tutorial.

+1

Un comentario sobre por qué esto se downvoted sería muy apreciado. No veo por qué dar un enlace hacia abajo a un sitio web de referencia RegEx debe ser downvoted, especialmente cuando dice en la pregunta "Por favor, dame una referencia o la forma de hacerlo". – RuudKok

0

Usando

(\d\d)?\d\d\/\d\d?/\d\d? \d\d?:\d\d:\d\d 

pudo validar la sintaxis, sino como balpha señala, eso no quiere que sea una fecha válida.

6

Debería considerar no hacer esto con expresiones regulares, sino simplemente ejecutar la cadena a través de DateTime con la cadena de formato adecuada. De esta forma, puedes asegurarte de que efectivamente es una marca de tiempo válida y no solo algo que se parece a eso.

1
function validateTimestamp(timestamp) { 

    if (!/\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}/.test(timestamp)) { 
     return false; 
    } 

    var split = timestamp.split(/[^\d]+/); 

    var year = parseFloat(split[0]); 
    var month = parseFloat(split[1]); 
    var day = parseFloat(split[2]); 

    var hour = parseFloat(split[3]); 
    var minute = parseFloat(split[4]); 
    var second = parseFloat(split[5]); 

    return hour < 25 && minute < 61 && second < 61 && month < 13 && day < 32; 

} 
3

Aquí es una expresión regular que escribí el día de hoy para la validación de cadenas en un formato similar a lo que usted ha mencionado: YYYY-MM-DD hh:mm:ss. No identifica algunas fechas incorrectas (por ejemplo, el 30 de febrero) pero puede ser un poco mejor que usar el \d simplista en cada posición.A tener en cuenta:

  1. puede especificar sólo una fecha, sólo una vez, o ambos fecha + hora
  2. tiempo puede estar en formato de 12 horas o de 24 horas
  3. segundos son opcionales
  4. aM/pM es opcional

    const std::string dateAndTimeRegex = 
        "^\\s*"      // ignore whitespace 
        "("       // start of date 
         "201[0-9]"    // year: 2010, 2011, ..., through 2019 
         "\\W"     // delimiter between year and month; typically will be "-" 
         "([0]?[0-9]|1[012])" // month: 0 through 9, or 00 through 09, or 10 through 12 
         "\\W"     // delimiter between month and day; typically will be "-" 
         "([012]?[0-9]|3[01])" // day: 0 through 9, or 00 through 29, or 30, or 31 
        ")?"      // end of optional date 
        "\\s?"      // optional whitespace 
        "("       // start of time 
         "([01]?[0-9]|2[0-3])" // hour: 0 through 9, or 00 through 19, or 20 through 23 
         "\\W"     // delimiter between hours and minutes; typically will be ":" 
         "([0-5][0-9])"   // minute: 00 through 59 
         "("      // start of seconds (optional) 
          "\\W"    // delimiter between minutes and seconds; typically will be ":" 
          "([0-5][0-9])"  // seconds: 00 through 59 
         ")?"     // end of optional seconds 
         "(\\s*[AaPp][Mm])?"  // optional AM, am, PM, pm 
        ")?"      // end of optional time 
        "\\s*$";     // trailing whitespace 
    
4

simplemente escribí una expresión regular para controlar una fecha y hora de MySQL (y creo que no es tan dif erent para Oracle u otro servidor de base de datos).

Este ReGex es muy seguro y controla la validez de la fecha (meses en 28, 30 & 31 días e incluso años en 29/02). Entonces, controla el tiempo. El formato de hora es ésta:

AAAA-MM-DD HH: MM: SS

Aquí es la expresión regular (bastante largo):

((((19|20)([2468][048]|[13579][26]|0[48])|2000)-02-29|((19|20)[0-9]{2}-(0[4678]|1[02])-(0[1-9]|[12][0-9]|30)|(19|20)[0-9]{2}-(0[1359]|11)-(0[1-9]|[12][0-9]|3[01])|(19|20)[0-9]{2}-02-(0[1-9]|1[0-9]|2[0-8])))\s([01][0-9]|2[0-3]):([][0-9]):([][0-9])) 

Partidos

2013-04-05 17:59:59 | 2013-07-30 01:22:42 | 2099-12-30 23:59:59 | 2016-02-28 00:00:00

no-partidos

2016-02-29 -01: 01: 02 | 3000-04-24 17:42:21 | 2012-03-03 24:24:02 | 2012-03-03 21:60:45

No creo que pueda hacer uno más seguro. Muy funcional y probado. Por favor, si usted lo usa, no dude en darme retroalimentación;)

FYI: Si sólo se observa para el control de fecha expresión regular sin tiempo, por favor ir allí para encontrarlo: Regular Expression to match valid dates (comprobar mi post) .

Saludos

1

Para una fecha válida entre el año 1000 y el año 2999 el uso:

String pattern = "((1\\d{3})|(20\\d{2}))-((0\\d)|(1[0-2]))-(([1-2]\\d)|(3[0-1])) (([0-1]\\d)|(2[0-3])):([0-5]\\d):([0-5]\\d)"; 

Los meses pueden variar entre 01 y 12, los días entre el 01 y el 31 y el tiempo entre las 00:00 : 00 y 23:59:59.

0
function isTimestamp($input){ 
      var $regex = /^\d\d\d\d-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$/; 
      return $regex.test($input); 
     } 

cheque por favor

Cuestiones relacionadas