2010-05-11 28 views
6

Estoy extrayendo datos de un feed del que no tengo control y necesito verificar si una cadena que se me da es válida.Ruby: ¿Cómo verificar si una cadena es una hora válida?

La mayoría de las veces me envían algo así como "2:35" o "15:41" pero otras veces es "AM" o "PM" (y no hay números) ... así que en última instancia Solo necesito ignorarlos.

Entonces, ¿cómo puedo verificar si los datos son una hora válida?

Respuesta

8

Puede utilizar Time.parse() y comprobar la excepción ArgumentError para tiempos inválidos.

¡La ventaja adicional es que también tiene el tiempo en un formato utilizable para trabajar si es válido!

+6

¡No use el análisis sintáctico para validar! Time.parse ('2: 34-^5') # => 2012-08-14 02:34:00 -0400 – Bob

+5

El uso de parse para validar puede dar como resultado algunos tiempos no válidos perdidos, por ejemplo: 'Time.parse ('27 : 45 PM ') '=> 2012-12-04 15:45:00 -0500 – tjstankus

7

No ha especificado exactamente lo que suponemos que es una hora válida (por ejemplo, si debe aceptar segundo opcionales), así que aquí tiene una conjetura:

data =~ /^([01]?[0-9]|2[0-3])\:[0-5][0-9]$/ 
+0

aunque Time.parse() con un rescate puede funcionar, preferiría la solución de expresiones regulares. Las excepciones en ruby ​​no se consideran realmente rápidas, así que a menos que necesites el objeto del tiempo, este es el consejo con el que me gustaría ir. –

+0

El uso de expresiones regulares trae problemas por sí mismo: muchos formatos de tiempo diferentes hacen que sea muy complicado verificar si el tiempo dado es válido. Cuando quiera admitir todos/la mayoría de los formatos de tiempo posibles, básicamente está reimplementando el método 'Time.parse()' ... – Veger

+3

Todo depende de qué tan estricto le gustaría ser al aceptar los valores. Supuse el rigor máximo (solo lo opcional es un cero inicial en horas). La pregunta no especifica. Además de eso, 'Time.parse' parece ser realmente muy liberal cuando se trata de argumentos. Pruebe, por ejemplo: 'Time.parse '10'' y' Time.parse' asd''. Ninguno arroja una excepción (al menos en 1.9.1). Realmente no confiaría en eso. –

Cuestiones relacionadas