Eu tenho uma string: "31-02-2010"
e quero verificar se é ou não uma data válida. Qual é a melhor maneira de fazer isso?
Preciso de um método que retorne verdadeiro se a string for uma data válida e falso se não for.
ruby-on-rails
ruby
string
date
Salil
fonte
fonte
Respostas:
fonte
Aqui está um liner simples:
Eu provavelmente não recomendaria fazer exatamente isso em todas as situações da vida real, ao forçar o chamador a verificar se há zero, por exemplo. particularmente durante a formatação. Se você retornar um erro de data | padrão, pode ser mais amigável.
fonte
Date.strptime(date, '%d/%m/%Y') rescue nil
rescue
é recomendado.fonte
is_valid?
? Tentei 1.8, 2.0 e 2.1. Nenhum deles parece ter esse. Todos parecem tervalid_date?
, no entanto.As datas de análise podem ser complicadas, especialmente quando estão no formato MM / DD / AAAA ou DD / MM / AAAA, como datas curtas usadas nos EUA ou na Europa.
Date#parse
tenta descobrir qual usar, mas há muitos dias em um mês ao longo do ano em que a ambiguidade entre os formatos pode causar problemas de análise.Eu recomendo descobrir qual é a LOCALE do usuário, então, com base nisso, você saberá como analisar de forma inteligente usando
Date.strptime
. A melhor maneira de descobrir onde um usuário está localizado é perguntar a ele durante a inscrição e, em seguida, fornecer uma configuração em suas preferências para alterá-la. Supondo que você possa desenterrá-lo por meio de alguma heurística inteligente e não incomodar o usuário com essa informação, está sujeito a falhas, então é só perguntar.Este é um teste usando
Date.parse
. Estou nos EUA:O primeiro era o formato correto para os EUA: mm / dd / aaaa, mas Date não gostou. A segunda estava correta para a Europa, mas se seus clientes residirem predominantemente nos EUA, você obterá muitas datas mal analisadas.
Ruby
Date.strptime
é usado como:fonte
01/01/2014
, qual é o mês e qual é o dia? No mês dos EUA seria o primeiro, no resto do mundo seria o segundo.Date.valid_date? *date_string.split('-').reverse.map(&:to_i)
fonte
require "date"
primeiro ou obterá "método indefinido".Date.valid_date? *Array.new(3).zip(date_string.split('-')).transpose.last.reverse.map(&:to_i)
Eu gostaria de estender a
Date
aula.exemplo
fonte
Outra forma de validar a data:
fonte
Experimente regex para todas as datas:
Apenas para o seu formato com zeros à esquerda, último ano e travessões:
o [- /] significa - ou /, a barra deve ter escape. Você pode testar isso em http://gskinner.com/RegExr/
adicione as seguintes linhas, todas elas serão destacadas se você usar a primeira regex, sem a primeira e a última / (elas são para uso em código ruby).
fonte
32-13-2010
erradas.'00/00/0000'
e'99-99/9999'
são possíveis candidatos.Uma solução mais rígida
É mais fácil verificar se uma data está correta se você especificar o formato de data esperado. No entanto, mesmo assim, Ruby é um pouco tolerante demais para o meu caso de uso:
Claramente, pelo menos uma dessas strings especifica o dia da semana errado, mas Ruby felizmente ignora isso.
Aqui está um método que não funciona; ele valida que
date.strftime(format)
convertidos de volta à mesma cadeia de entrada que ele seja analisado comDate.strptime
segundoformat
.fonte
Date.today().iso8601
);%m
é preenchido com zeros. Se você quiser algo diferente, consulte ruby-doc.org/stdlib-2.4.0/libdoc/date/rdoc/…Postar isso porque pode ser útil para alguém mais tarde. Não tenho ideia se essa é uma "boa" maneira de fazer isso ou não, mas funciona para mim e é extensível.
Este complemento para a classe String permite que você especifique sua lista de delimitadores na linha 4 e, em seguida, sua lista de formatos válidos na linha 5. Não é nada complicado, mas torna muito fácil estender e permite que você simplesmente verifique uma string como:
fonte
fonte
Você pode tentar o seguinte, que é a maneira mais simples:
Mas você precisa lidar com a exceção.
fonte
Date.parse não gerou exceção para estes exemplos:
Eu prefiro esta solução:
fonte
Método:
Uso:
Isso retorna verdadeiro ou falso se config [: datas] = "10/12/2012, 05/09/1520"
fonte