Разобрать строки "X лет и Y недель назад" в Ruby - PullRequest
7 голосов
/ 17 июня 2011

Существует ли универсальный синтаксический анализатор для анализа строк "... ago" и превращения их в объекты DateTime?

Возможные предложения:

  • 1 год | @count лет (и 1 неделя | @count недель) назад
  • 1 неделя | @count недель (и 1день | @count days) назад
  • 1 день | @count дней (и 1 час | @count часов) назад
  • 1 час | @count часов назад (и 1 минута | @count min) назад
  • 1 мин | @count мин назад (и 1 сек | @count сек) назад
  • 1 сек | @count сек назад

Так что либокомбинация двух (Foo и Bar ago) или только одного (Foo ago).И это может быть как в единственном, так и во множественном числе.

Ruby's DateTime::parse() не может справиться с этим, равно как и DateTime::strptime().

Я надеюсь, что где-нибудь найдется самоцвет или фрагмент, который это обработает.

В противном случае мне придется создать свой собственный синтаксический анализатор, и в этом случае будет приветствоваться указатель на то, как создавать собственные синтаксические анализаторы DateTime.

Sidenote: Для использования в будущем: этовременные строки, сгенерированные Drupals Интервал форматирования

1 Ответ

9 голосов
/ 17 июня 2011

Драгоценный камень Chronic может быть тем, что вы ищете.

require 'chronic'
Chronic.parse "2 days ago"
# => 2011-06-14 14:13:59 -0700

За @injekt (один из сопровождающих Chronic) вы можете справиться "1 год и 1 неделю назад"вот так:

str = "one year and 1 week ago"
chunks = str.split('and')

Chronic.parse(chunks[1], :now => Chronic.parse(chunks[0] + 'ago'))
#=> 2010-06-09 14:29:37 -0700
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...