2016-07-20 4 views
1

Wie überprüft man, ob das Datum ein gültiges Datum in Ruby ist. Viele der Methoden überprüfen nur den Bereich. Aber ich muss das Datum mit dem Tag der Woche überprüfen, ob das Datum gültig ist oder nicht. Für Beispiel:Datumsvalidierung in Ruby

20 Jul 2016 Wed --> Valid 
    20 Jul 2016 Mon --> Not-Valid 

Wie man das in Rubin macht?

+0

Sie erhalten das Datum als Zeichenfolge oder ein Date-Objekt – SpunkyLive

+0

@SpunkyLive String – mrg

Antwort

1

Ich werde nicht auf die beste Lösung jemals vorgeben, aber das sollte funktionieren.

def valid_date?(date) 
    Date.parse(date).strftime("%d %b %Y %a") == date 
end 

[55] pry(main)> valid_date?("20 Jul 2016 Wed") 
=> true 
[56] pry(main)> valid_date?("20 Jul 2016 Mon") 
=> false 
[57] pry(main)> 

Wenn Sie viele Formate haben, können Sie Format als zweites Argument

def valid_date?(date, fmt) 
    Date.parse(date).strftime(fmt) == date 
end 

=> :valid_date? 
[59] pry(main)> valid_date?("20 Jul 2016 Wed", "%d %b %Y %a") 
=> true 

Hoffnung passieren, das wird helfen.

UPDATE

Wie ich in Kommentar erwähnt, dass Methodenname Überschneidungen mit bestehenden Verfahren valid_date?

So können Sie nur die benutzerdefinierte Methode

def date_valid?(date, fmt) 
    Date.parse(date).strftime(fmt) == date 
end 

[2] pry(main)> date_valid?("20 Jul 2016 Wed", "%d %b %Y %a") 
=> true 
+0

Es erzeugt den folgenden Fehler. 'd.rb: 6: in valid_date? ': falsche Anzahl von Argumenten (2 für 3..4) (ArgumentError)' – mrg

+0

Welche Rails-Version verwenden Sie? – retgoat

+0

ruby ​​1.9.3p0 (2011-10-30 revision 33570) [i686-linux] – mrg

1

Nur aus Neugier umbenennen:

dates = ['20 Jul 2016 Wed', '20 Jul 2016 Mon'] 
dates.map do |date| 
    Date.parse(date).public_send(
    Date.instance_methods.detect do |m| 
     m.to_s =~ /\A#{date[-3..-1].downcase}.*day\?\z/ 
    end) 
end 
#⇒ [ true, false ] 
1
require 'date' 

dates = ['20 Jul 2016 Wed', '20 Jul 2016 Mon'] 

dates.select do |s| 
    d = Date.strptime(s[0,11], "%d %b %Y") rescue nil 
    d.nil? ? false : (Date::ABBR_DAYNAMES[d.wday] == s[-3,3]) 
end 
    #=> ["20 Jul 2016 Wed"] 

Das liest, "wählen Sie Zeichenfolgen 'dd mmm yyyy' aus, die gültige Daten darstellen und deren Wochentag dem Wochentag entspricht, der von den letzten drei Zeichen der Zeichenfolge angegeben wird".