J'ai une corde : "31-02-2010"
et je veux vérifier s'il s'agit d'une date valide ou non. Quelle est la meilleure façon de procéder ?
J'ai besoin d'une méthode qui renvoie vrai si la chaîne est une date valide et faux si elle ne l'est pas.
J'ai une corde : "31-02-2010"
et je veux vérifier s'il s'agit d'une date valide ou non. Quelle est la meilleure façon de procéder ?
J'ai besoin d'une méthode qui renvoie vrai si la chaîne est une date valide et faux si elle ne l'est pas.
Les exceptions ne doivent être utilisées que lorsque vous ne vous attendez pas vraiment à une erreur.
Voici un exemple simple :
DateTime.parse date rescue nil
Je ne recommanderais probablement pas de faire exactement cela dans toutes les situations de la vie réelle, car vous obligez l'appelant à vérifier que la valeur est nulle, notamment lors du formatage. Si vous renvoyez une date|erreur par défaut, cela peut être plus convivial.
Si vous souhaitez appliquer une option stricte de chaîne de date à format unique, c'est la meilleure option car elle évite les exceptions et est déterministe. Date.valid_date ? est la méthode à utiliser, du moins pour Ruby 2. ruby-doc.org/stdlib-2.0.0/libdoc/date/rdoc/
L'analyse des dates peut donner lieu à quelques problèmes, notamment 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 de nombreux 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 trouver quelle est la LOCALE de l'utilisateur, puis, en fonction de cela, vous saurez comment analyser intelligemment en utilisant Date.strptime
. La meilleure façon de savoir où se trouve un utilisateur est de le lui demander lors de l'inscription, puis de prévoir un paramètre dans ses préférences pour le modifier. Si l'on suppose que l'on peut trouver cette information par une astuce intelligente et ne pas déranger l'utilisateur, on risque d'échouer, alors il suffit de demander.
Il s'agit d'un test utilisant Date.parse
. Je suis aux États-Unis :
>> Date.parse('01/31/2001')
ArgumentError: invalid date
>> Date.parse('31/01/2001') #=> #<Date: 2001-01-31 (4903881/2,0,2299161)>
Le premier était le format correct pour les États-Unis : mm/dd/yyyy, 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's Date.strptime
est utilisé comme :
>> Date.strptime('12/31/2001', '%m/%d/%Y') #=> #<Date: 2001-12-31 (4904549/2,0,2299161)>
Votre LOCALE semble erronée. J'obtiens ceci >> Date.parse('01/31/2001') => Wed, 31 Jan 2001 >> ?> Date.parse('31/01/2001') ArgumentError : invalid date
Je ne sais pas si je suis stupide, mais cela semble expliquer uniquement comment analyser une date, et non comment la valider. La réponse acceptée utilise l'exception ArgumentError, mais cela ne semble pas être une bonne idée, pour les raisons indiquées dans un commentaire.
Il existe une situation connue dans laquelle vous ne pouvez pas valider une date. C'est le cas lorsque les valeurs du jour et du mois sont ambiguës et que vous devez connaître le format de la chaîne de date entrante. Et c'est ce que dit la réponse. Si cela ressemble à 01/01/2014
quel est le mois et quel est le jour ? Aux États-Unis, le mois serait en premier, dans le reste du monde, il serait en second.
Excellent, merci. Celle-ci semble être disponible au moins dans les versions 1.8, 2.0 et 2.1. Notez que vous devez require "date"
d'abord ou vous obtiendrez "méthode indéfinie".
Cette méthode peut lever une exception 'ArgumentError : wrong number of arguments' au lieu de retourner false. Par exemple, si votre chaîne de caractères contient des slashs au lieu de tirets
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
2 votes
Pourquoi ne pas simplement faire une liste déroulante date_heure au lieu de prendre une chaîne de caractères que vous devez valider ?
0 votes
Je l'ai déjà suggéré mais je ne peux pas le faire :)
0 votes
En règle générale, n'êtes-vous pas censé effectuer la validation des entrées sur le frontal d'une application ?
0 votes
De bien meilleures réponses ici - voici comment faire. stackoverflow.com/questions/597328/
4 votes
Validez toujours le back-end, quelle que soit la qualité de votre front-end, ne lui faites pas confiance !
0 votes
Duplicata possible de Comment valider une date dans rails ?
0 votes
J'utilise ceci :
"31-02-2010".to_time.present?