У меня есть строка: "31-02-2010"
и я хочу проверить, действительна ли это дата. Как лучше всего это сделать?
Мне нужен метод, который возвращает true, если строка является действительной датой, и false, если это не так.
ruby-on-rails
ruby
string
date
Salil
источник
источник
Ответы:
источник
Вот простой лайнер:
Я бы, вероятно, не рекомендовал делать именно это в каждой ситуации в реальной жизни, поскольку вы заставляете вызывающего абонента проверять ноль, например. особенно при форматировании. Если вы вернете дату по умолчанию | ошибка, это может быть удобнее.
источник
Date.strptime(date, '%d/%m/%Y') rescue nil
rescue
не рекомендуется.источник
is_valid?
? Пробовал 1.8, 2.0 и 2.1. Похоже, ни у кого из них этого нет.valid_date?
Хотя, похоже , все имеют .При анализе дат могут возникать некоторые проблемы, особенно когда они указаны в формате ММ / ДД / ГГГГ или ДД / ММ / ГГГГ, например, короткие даты, используемые в США или Европе.
Date#parse
пытается выяснить, какой из них использовать, но в течение года бывает много дней в месяце, когда неоднозначность между форматами может вызвать проблемы синтаксического анализа.Я бы порекомендовал выяснить, что такое LOCALE пользователя, а затем, основываясь на этом, вы будете знать, как разумно анализировать, используя
Date.strptime
. Лучший способ узнать, где находится пользователь, - спросить его во время регистрации, а затем указать параметр в его предпочтениях, чтобы изменить его. Предполагая, что вы можете откопать это с помощью какой-то умной эвристики и не беспокоить пользователя этой информацией, это может привести к неудаче, поэтому просто спросите.Это тест с использованием
Date.parse
. Я в США:Первым был правильный формат для США: мм / дд / гггг, но Дате он не понравился. Второе было правильным для Европы, но если ваши клиенты преимущественно проживают в США, вы получите много плохо разобранных дат.
Ruby
Date.strptime
используется как:источник
01/01/2014
, какой месяц, а какой день? В США месяц будет первым, в остальном мире - вторым.Date.valid_date? *date_string.split('-').reverse.map(&:to_i)
источник
require "date"
сначала, иначе вы получите «неопределенный метод».Date.valid_date? *Array.new(3).zip(date_string.split('-')).transpose.last.reverse.map(&:to_i)
Я хочу продлить
Date
класс.пример
источник
Другой способ проверить дату:
источник
Попробуйте регулярное выражение для всех дат:
Только для вашего формата с ведущими нулями, последним годом и дефисами:
[- /] означает или - или /, косая черта должна быть экранирована. Вы можете проверить это на http://gskinner.com/RegExr/
добавьте следующие строки, все они будут выделены, если вы используете первое регулярное выражение, без первого и последнего / (они используются в коде ruby).
источник
32-13-2010
который неверен".'00/00/0000'
и'99-99/9999'
являются возможными кандидатами.Более строгое решение
Проверить правильность даты проще, если указать ожидаемый формат даты. Однако даже в этом случае Ruby слишком терпим для моего варианта использования:
Ясно, что по крайней мере одна из этих строк указывает неправильный день недели, но Ruby с радостью игнорирует это.
Вот метод, который этого не делает; это подтверждает , что
date.strftime(format)
обращенные назад к одной и той же входной строке , что она разобранной сDate.strptime
согласноformat
.источник
Date.today().iso8601
);%m
дополняется нулями. Если вы хотите чего-то другого, см. Ruby-doc.org/stdlib-2.4.0/libdoc/date/rdoc/…Публикуем это, потому что это может быть кому-то полезно позже. Не знаю, «хороший» это способ сделать это или нет, но он работает для меня и его можно расширить.
Это дополнение для класса String позволяет указать список разделителей в строке 4, а затем список допустимых форматов в строке 5. Это не ракетостроение, но упрощает его расширение и позволяет просто проверять строку следующим образом:
источник
источник
Вы можете попробовать следующий простой способ:
Но вам нужно обработать исключение.
источник
Date.parse не вызывает исключения для этих примеров:
Я предпочитаю это решение:
источник
Метод:
Использование:
Это возвращает истину или ложь, если config [: date] = "12.10.2012, 05.09.1520"
источник