2016-07-20 4 views
1

Как проверить, действительно ли дата действительна в рубине. Многие из методов проверяют только диапазон. Но мне нужно проверить дату с днем ​​ неделю, чтобы проверить, действительна ли дата или нет. Для Ex:Дата проверки в Ruby

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

Как это сделать в рубине?

+0

Вы получаете дату в виде строки или объекта даты – SpunkyLive

+0

@SpunkyLive String – mrg

ответ

1

Я не претендую на лучшее решение когда-либо, но это должно сработать.

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

Если у вас есть много форматов, вы можете передать формат в качестве второго аргумента

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 

Надежда это поможет.

UPDATE

Как я уже говорил в комментариях, что имя метода совпадает с существующим методом valid_date?

Таким образом, вы можете просто переименовать пользовательский метод

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

Производит следующую ошибку. 'd.rb: 6: in valid_date? ': неправильное количество аргументов (2 для 3..4) (ArgumentError)' – mrg

+0

Какую версию Rails вы используете? – retgoat

+0

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

1

Просто из любопытства:

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

В этом разделе говорится: «Выберите строки 'dd mmm yyyy', которые представляют действительные даты и чей день недели соответствует дню недели, указанному последними тремя символами строки».