2011-06-16 16 views
7

¿Hay un analizador genérico para analizar cadenas "... ago" y convertirlas en objetos DateTime?Parse "X años y hace Y hace" cadenas parecidas en Ruby

frases posibles son:

  • 1 año | @Count años (y 1 semana | semanas @Count) hace
  • 1 semana | semanas @Count (y 1 día | @Count días) hace
  • 1 día | @Count días (y 1 horas | @Count horas) hace
  • 1 horas | hace horas @Count (y 1 min | @count min) hace
  • 1 min | hace @count min (y 1 sec | @count sec) hace
  • 1 sec | @count sec hace

Es una combinación de dos (hace Foo y Bar) o solo uno (hace Foo). Y puede ser singular o plural.

Ruby's DateTime::parse() no puede manejar esto, ni tampoco DateTime::strptime().

Estoy esperando una gema o un fragmento en algún lugar que maneje esto.

De lo contrario, tendré que crear mi propio analizador, en cuyo caso sería muy bienvenido un puntero a cómo crear los propios DateTime Parsers.

Nota al margen: Para futuras consultas: Estos son los generados por timestrings Drupals Format Interval

Respuesta

9

La gema Chronic puede ser lo que estás buscando.

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

por @injekt (uno de los mantenedores de crónicas), que puede manejar "hace 1 año y 1 semana" de esta manera:

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 
+4

(mantenedor crónica aquí) @dmarkow es correcta, crónica no puede manejar cosas como '1 año y 1 semana atrás', generalmente es bastante fácil dividirlos en segmentos y manejarlos por separado. ¡No dude en abrir una solicitud de función en http://github.com/mojombo/chronic y lo investigaré! –

+0

Agregando a esto (no quiero dar otra respuesta a esta pregunta, esta respuesta debe ser la aceptada). Consulte este fragmento para manejarlo varias veces: https://gist.github.com/61529720a993aaad30a3 –

+0

@injekt ¡Agradable! Incorporaré en mi respuesta. –