Обеспечение строки имеет формат времени или формат даты?

У меня есть метод, который анализирует строку в на дату, но я хочу проверить это, я не пытаюсь проанализировать не числовую строку или строку, какой преподаватель представляют формат даты или формат времени?

как может идентификатор o это?

в данный момент я имею:

if(string=~ /^\D*$/ )
{
return false
else 
do something_else
}

это было хорошо для не числовой строки как "UNKNOWN" но не работал бы на "UNKNOWN1"

какая-либо идея, что я могу использовать, чтобы удостовериться, что только дата или форматы времени анализируются?

9
задан Mo. 5 August 2010 в 10:34
поделиться

3 ответа

DateTime.strptime v ParseDate.parsedate

Никакой каламбура, но информация здесь устарела (2015 г.), а некоторые методы и модули были удалены из Ruby 2.x. Я оставляю это здесь на всякий случай кто-то где-то до сих пор использует 1.8.7

Ладно, может быть там был умышленный каламбур ;-)


Вы могли бы подумать, что можете использовать Date.parse или DateTime.parse для проверки неверных дат (подробнее см. Date.parse здесь )

d = Date.parse(string) rescue nil

if d 
   do_something
else
   return false
end

, потому что неправильные значения вызывают исключение, которое можно перехватить. Однако предлагаемые тестовые строки фактически возвращают Date с Date.parse

Например ..

~\> irb
>> Date.parse '12-UNKN/34/OWN1'
=> #<Date: 4910841/2,0,2299161>
>> 

Date.parse просто недостаточно умен, чтобы выполнять эту работу: - (

ParseDate.parsedate работает лучше. Вы можете видеть, что он пытается проанализировать дату, но в тестовых примерах не находит действительный год или месяц. Подробнее здесь

>> require 'parsedate'
=> true
>> ParseDate.parsedate '2010-09-09'
=> [2010, 9, 9, nil, nil, nil, nil, nil]
>> ParseDate.parsedate 'dsadasd'
=> [nil, nil, nil, nil, nil, nil, nil, nil]
>> ParseDate.parsedate '12-UNKN/34/OWN1'
=> [nil, nil, 12, nil, nil, nil, nil, nil]
>> ParseDate.parsedate '12-UNKN/34/OWN1'
=> [nil, nil, 12, nil, nil, nil, nil, nil]
13
ответ дан 4 December 2019 в 14:26
поделиться

Парсеры Ruby оптимистичны, если вы можете выбросить кучу мусора и получить результат из входной строки, Date.parse и DateTime.strptime попробует это сделать.

Вам нужна пессимистическая и строгая проверка, что означает, что вместо того, чтобы предполагать принятие после попытки охоты за мусором с помощью регулярного выражения, вы должны предполагать отказ и искать сокровища с помощью регулярного выражения.

Ваша первая проверка: «Является ли строка числовой?» Использует регулярное выражение, чтобы попытаться найти строку, полностью состоящую из нечисловых символов, и отклоняет ее, если находит ее. \ D (с заглавной буквой D) ищет нечисловые символы, а входные строки будут соответствовать вашему регулярному выражению, только если оно полностью состоит из 0 или более нечисловых символов.

Вероятно, вам больше повезет со следующей логикой для числовых значений:

if(string=~ /^\d*$/ )
 something_else
else 
 return false
end

Это соответствует строке, состоящей полностью из 0 или более числовых символов, выполняет something_else , если находит ее, и возвращает false в противном случае .

Если вы хотите явно искать время и отклонять все другие значения. Для формата ЧЧ: ММ: SSAM, который допускает пропуск начальных 0 для каждого поля, с 12-часовым временем вы можете использовать следующее:

if (string =~ /^[01]?\d:[0-5]?\d:[0-5]?\d[AP]M$/)
  something_else
else
  return false
end

Аналогично для дат, вы хотите явно искать действительные даты и отклонять все остальные значения.Для ММ / ДД / ГГГГ, которые допускают пропуск нулей в начале для всего поля, кроме лет, вы можете использовать:

if (string =~ /^[0-1]\d\/[0-3]?\d\/\d{4}/)
  something_else
else
  return false
end

Вспомогательные функции Ruby стараются быть подробными в том, что они принимают, но для проверки это бесполезная черта. Будьте строгими, предполагайте, что все недействительно, пока не будет доказано обратное, а затем примите это.

0
ответ дан 4 December 2019 в 14:26
поделиться

Я бы посоветовал вам составить список форматов даты и даты и времени, которые вы ожидаете и собираетесь поддерживать. Вы можете определить их, используя strftime совместимые строки, а затем использовать те же строки при синтаксическом анализе дат, используя DateTime # strptime . Попробуйте проанализировать входные строки с помощью каждого поддерживаемого шаблона, первый из которых не генерирует исключение, вернет проанализированную дату. Если каждый выдает исключение, строка не является допустимой датой.

0
ответ дан 4 December 2019 в 14:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: