Как получить strptime для поднятия ArgumentError с символами завершения мусора - PullRequest
2 голосов
/ 03 июня 2010

Мы должны обрабатывать указанные пользователем форматы даты в нашем приложении. Мы решили использовать Date.strptime для анализа и проверки, что прекрасно работает, за исключением того, что оно просто игнорирует любые введенные данные мусора. Вот сеанс irb, демонстрирующий проблему

ree-1.8.7-2010.01 > require 'date'
 => true 
ree-1.8.7-2010.01 > d = Date.strptime '2001-01-01failfailfail', '%Y-%m-%d'
 => #<Date: 4903821/2,0,2299161> 
ree-1.8.7-2010.01 > d.to_s
 => "2001-01-01" 

что мы хотели бы, так это поведение, подобное этому

ree-1.8.7-2010.01 > d = Date.strptime '2001failfailfail-01-01', '%Y-%m-%d'
ArgumentError: invalid date

Любые предложения будут оценены

Ответы [ 2 ]

1 голос
/ 03 июня 2010

Одна из возможностей - передать полученную дату через strftime в том же формате и сравнить с исходной строкой.

т.е. valid = Date.strptime(date_string, format).strftime(format) == date_string

Одним из ограничений является то, что он не будет обрабатывать начальные 0 в некоторых частях даты, например. если вы хотите принять 2010-6-1, но strftime вернул 2010-06-01, у вас не будет совпадения.

Кроме того, я не уверен, что вы имели в виду это или нет, но ваш второй пример Date.strptime '2001failfailfail-01-01', '%Y-%m-%d' действительно поднимает ArgumentError. Кажется, что игнорируется только конечный мусор.

0 голосов
/ 03 июня 2010

Одним из способов является определение нового класса, который сначала выполняет проверку.

require 'date'

class Mydate 

    def self.strptime(string)
        raise ArgumentError 'Fail' if  string !~ /^\d\d\d\d-\d\d-\d\d$/
        Date.strptime(string)
    end
end

d = Mydate.strptime '2001-01-01'
puts d

d2 = Mydate.strptime '2001-01-02xxxx'
puts d2

Другим способом было бы открыть класс Date, псевдоним метода strptime, написать новый, чтобы выполнить необходимую вам проверку, а затем вызвать псевдоним.

require 'date'

class Date

    class << self
        alias :orig_strptime :strptime
    end

    def self.strptime(string)
        puts "in new strptime"
        raise ArgumentError 'Fail' if  string !~ /^\d\d\d\d-\d\d-\d\d$/ 
        Date.orig_strptime(string) 
    end  
end

d = Date.strptime '2001-01-01'
puts d

d2 = Date.strptime '2001-01-02xxxx'
puts d2   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...