123 votes

Comment vérifier si une chaîne de caractères est une date valide ?

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.

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 ?

119voto

mpd Points 883
require 'date'
begin
   Date.parse("31-02-2010")
rescue ArgumentError
   # handle invalid date
end

30 votes

Ce n'est pas une caractéristique de la classe Date, c'est la gestion des exceptions.

4 votes

Date.parse('2012-08-13== 00:00:00') # => Mon, 13 Aug 2012

2 votes

Les exceptions ne doivent être utilisées que lorsque vous ne vous attendez pas vraiment à une erreur.

57voto

robert_murray Points 76

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.

10 votes

DateTime.parse "123" rescue nil . Cela renvoie une date réelle 3 mai 2017

3 votes

Date.strptime(date, '%d/%m/%Y') rescue nil

2 votes

Utilisation de l'inline rescue est découragée.

56voto

Sohan Points 1766
d, m, y = date_string.split '-'
Date.valid_date? y.to_i, m.to_i, d.to_i

0 votes

C'est assez simple et bon pour imposer un format xx-xx-YYYY.

0 votes

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/

4 votes

Quelle version de Ruby supporte is_valid? ? J'ai essayé les versions 1.8, 2.0 et 2.1. Aucune d'entre elles ne semble avoir celle-là. Toutes semblent avoir valid_date? mais

29voto

the Tin Man Points 69148

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)>

0 votes

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

0 votes

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.

0 votes

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.

28voto

Samer Buna Points 1353

Date.valid_date? *date_string.split('-').reverse.map(&:to_i)

0 votes

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".

2 votes

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

2 votes

Peut-être pouvons-nous faire quelque chose comme ça, pour gérer les dates mal formatées.. : Date.valid_date? *Array.new(3).zip(date_string.split('-')).transpose.last.rev‌​erse.map(&:to_i)

Prograide.com

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.

Powered by:

X