Tengo una cadena: "31-02-2010"
y quiero comprobar si es una fecha válida o no. ¿Cuál es la mejor manera de hacerlo?
Necesito un método que devuelva verdadero si la cadena es una fecha válida y falso si no lo es.
ruby-on-rails
ruby
string
date
Salil
fuente
fuente
Respuestas:
fuente
Aquí hay un trazador de líneas simple:
Probablemente no recomendaría hacer exactamente esto en todas las situaciones de la vida real, ya que obliga a la persona que llama a verificar nulo, por ejemplo. particularmente al formatear. Si devuelve una fecha predeterminada | error, puede ser más amigable.
fuente
Date.strptime(date, '%d/%m/%Y') rescue nil
rescue
desaconseja el uso de inline .fuente
is_valid?
? Probé 1.8, 2.0 y 2.1. Ninguno de ellos parece tener ese. Sinvalid_date?
embargo, todos parecen haberlo hecho .Las fechas de análisis pueden encontrarse con algunos errores, especialmente cuando están en formato MM / DD / YYYY o DD / MM / YYYY, como las fechas cortas utilizadas en EE. UU. O Europa.
Date#parse
intenta averiguar cuál usar, pero hay muchos días en un mes durante todo el año en los que la ambigüedad entre los formatos puede causar problemas de análisis.Recomendaría averiguar cuál es el LOCAL del usuario, luego, basado en eso, sabrá cómo analizar inteligentemente usando
Date.strptime
. La mejor manera de saber dónde se encuentra un usuario es preguntarle durante el registro y luego proporcionar una configuración en sus preferencias para cambiarla. Suponiendo que pueda desenterrarlo mediante alguna heurística inteligente y no molestar al usuario por esa información, es propenso a fallar, así que pregunte.Esta es una prueba con
Date.parse
. Estoy en los estados unidos:El primero fue el formato correcto para los EE. UU.: Mm / dd / aaaa, pero a Date no le gustó. La segunda era correcta para Europa, pero si sus clientes residen predominantemente en EE. UU., Obtendrá muchas fechas mal analizadas.
Ruby
Date.strptime
se usa como:fuente
01/01/2014
, ¿cuál es el mes y cuál es el día? En los Estados Unidos el mes sería el primero, el resto del mundo sería el segundo.Date.valid_date? *date_string.split('-').reverse.map(&:to_i)
fuente
require "date"
primero o obtendrá un "método indefinido".Date.valid_date? *Array.new(3).zip(date_string.split('-')).transpose.last.reverse.map(&:to_i)
Me gustaría extender la
Date
clase.ejemplo
fuente
Otra forma de validar la fecha:
fuente
Pruebe las expresiones regulares para todas las fechas:
Solo para su formato con ceros a la izquierda, último año y guiones:
el [- /] significa - o /, la barra inclinada debe escaparse. Puede probar esto en http://gskinner.com/RegExr/
agregue las siguientes líneas, todas se resaltarán si usa la primera expresión regular, sin la primera y la última / (son para usar en código ruby).
fuente
32-13-2010
cuál es incorrecta.'00/00/0000'
y'99-99/9999'
son posibles candidatos.Una solución más estricta
Es más fácil verificar la exactitud de una fecha si especifica el formato de fecha que espera. Sin embargo, incluso entonces, Ruby es un poco demasiado tolerante para mi caso de uso:
Claramente, al menos una de estas cadenas especifica el día de la semana incorrecto, pero Ruby felizmente lo ignora.
Aquí hay un método que no lo hace; valida que
date.strftime(format)
vuelve a convertir a la misma cadena de entrada con la que analizó deDate.strptime
acuerdo conformat
.fuente
Date.today().iso8601
);%m
se rellena con ceros. Si desea algo diferente, consulte ruby-doc.org/stdlib-2.4.0/libdoc/date/rdoc/…Publicar esto porque podría ser útil para alguien más adelante. No tengo idea de si esta es una "buena" forma de hacerlo o no, pero funciona para mí y es ampliable.
Este complemento para la clase String le permite especificar su lista de delimitadores en la línea 4 y luego su lista de formatos válidos en la línea 5. No es ciencia espacial, pero hace que sea realmente fácil de extender y le permite simplemente verificar una cadena como esta:
fuente
fuente
Puede probar lo siguiente, que es la forma más sencilla:
Pero debes manejar la excepción.
fuente
Date.parse no generó una excepción para estos ejemplos:
Prefiero esta solución:
fuente
Método:
Uso:
Esto devuelve verdadero o falso si config [: fechas] = "10/12 / 2012,05 / 09/1520"
fuente