J'ai une chaîne: "31-02-2010"
et je veux vérifier si c'est une date valide ou non. Quelle est la meilleure façon de procéder?
J'ai besoin d'une méthode qui renvoie true si la chaîne est une date valide et false si ce n'est pas le cas.
ruby-on-rails
ruby
string
date
Salil
la source
la source
Réponses:
la source
Voici une simple doublure:
Je ne recommanderais probablement pas de faire exactement cela dans toutes les situations de la vie réelle, car vous forcez l'appelant à vérifier zéro, par exemple. en particulier lors du formatage. Si vous renvoyez une date par défaut | erreur, cela peut être plus convivial.
la source
Date.strptime(date, '%d/%m/%Y') rescue nil
rescue
est déconseillée.la source
is_valid?
? Essayé 1.8, 2.0 et 2.1. Aucun d'entre eux ne semble avoir celui-là.valid_date?
Mais tout semble l'avoir fait .L'analyse des dates peut se heurter à certains pièges, en particulier lorsqu'elles sont au format MM / JJ / AAAA ou JJ / MM / AAAA, comme les dates courtes utilisées aux États-Unis ou en Europe.
Date#parse
tente de déterminer lequel utiliser, mais il y a plusieurs jours dans un mois tout au long de l'année où l'ambiguïté entre les formats peut causer des problèmes d'analyse.Je recommanderais de savoir quelle est la LOCALE de l'utilisateur, puis, sur cette base, vous saurez comment analyser intelligemment en utilisant
Date.strptime
. La meilleure façon de trouver où se trouve un utilisateur est de lui demander lors de l'inscription, puis de fournir un paramètre dans ses préférences pour le modifier. En supposant que vous puissiez le découvrir par une heuristique intelligente et ne pas déranger l'utilisateur pour cette information, il est sujet à l'échec, alors demandez simplement.Ceci est un test utilisant
Date.parse
. Je suis aux USA:Le premier était le format correct pour les États-Unis: mm / jj / aaaa, mais Date ne l'aimait pas. La seconde était correcte pour l'Europe, mais si vos clients sont principalement basés aux États-Unis, vous obtiendrez beaucoup de dates mal analysées.
Ruby
Date.strptime
est utilisé comme:la source
01/01/2014
, quel est le mois et quel est le jour? Le mois américain serait le premier, le reste du monde serait le deuxième.Date.valid_date? *date_string.split('-').reverse.map(&:to_i)
la source
require "date"
abord ou vous obtiendrez "méthode non définie".Date.valid_date? *Array.new(3).zip(date_string.split('-')).transpose.last.reverse.map(&:to_i)
J'aimerais prolonger la
Date
classe.exemple
la source
Une autre façon de valider la date:
la source
Essayez regex pour toutes les dates:
Pour uniquement votre format avec des zéros non significatifs, l'année dernière et des tirets:
le [- /] signifie soit - soit /, la barre oblique doit être échappée. Vous pouvez tester ceci sur http://gskinner.com/RegExr/
ajoutez les lignes suivantes, elles seront toutes mises en surbrillance si vous utilisez la première regex, sans le premier et le dernier / (ils sont à utiliser dans le code ruby).
la source
32-13-2010
qui sont incorrectes.'00/00/0000'
et'99-99/9999'
sont des candidats possibles.Une solution plus stricte
Il est plus facile de vérifier l'exactitude d'une date si vous spécifiez le format de date attendu. Cependant, même dans ce cas, Ruby est un peu trop tolérant pour mon cas d'utilisation:
De toute évidence, au moins une de ces chaînes spécifie le mauvais jour de la semaine, mais Ruby ignore volontiers cela.
Voici une méthode qui ne le fait pas; il valide cette
date.strftime(format)
conversion en la même chaîne d'entrée avec laquelle il a analyséDate.strptime
selonformat
.la source
Date.today().iso8601
);%m
est rempli de zéro. Si vous voulez quelque chose de différent, voir ruby-doc.org/stdlib-2.4.0/libdoc/date/rdoc/…Publier ceci parce qu'il pourrait être utile à quelqu'un plus tard. Aucune idée si c'est une "bonne" façon de le faire ou non, mais cela fonctionne pour moi et est extensible.
Ce module complémentaire pour la classe String vous permet de spécifier votre liste de délimiteurs à la ligne 4, puis votre liste de formats valides à la ligne 5. Ce n'est pas sorcier, mais il est vraiment facile à étendre et vous permet simplement de vérifier une chaîne comme ceci:
la source
la source
Vous pouvez essayer ce qui suit, ce qui est simple:
Mais vous devez gérer l'exception.
la source
Date.parse n'a pas soulevé d'exception pour ces exemples:
Je préfère cette solution:
la source
Méthode:
Usage:
Cela renvoie vrai ou faux si config [: dates] = "12/10 / 2012,05 / 09/1520"
la source