¿Hay alguna gema o algo para analizar cadenas como "4h 30m", "1d 4h", algo así como las estimaciones en JIRA o planificadores de tareas, tal vez, con la internacionalización?Cómo analizar los días/horas/minutos/segundos en ruby?
Respuesta
Añadir un segundo respuesta, como crónica (que mi respuesta original sugirió) no le da lapsos, pero las marcas de tiempo.
Aquí está mi ir en un analizador.
class TimeParser
TOKENS = {
"m" => (60),
"h" => (60 * 60),
"d" => (60 * 60 * 24)
}
attr_reader :time
def initialize(input)
@input = input
@time = 0
parse
end
def parse
@input.scan(/(\d+)(\w)/).each do |amount, measure|
@time += amount.to_i * TOKENS[measure]
end
end
end
La estrategia es bastante simple. Dividir "5h"
en ["5", "h"]
, definir cuántos segundos representa "h"
(TOKENS
) y agregar esa cantidad a @time
.
TimeParser.new("1m").time
# => 60
TimeParser.new("1m wtf lol").time
# => 60
TimeParser.new("4h 30m").time
# => 16200
TimeParser.new("1d 4h").time
# => 100800
No debería ser muy difícil por lo que es manejar "1.5h"
o bien, al ver el código base es tan simple como es.
¿Pero en qué?
Esta analizará en un Hash:
"4h 30m".split(/\s/).each{|i| h[i.gsub(/\d+/,"")] = i.gsub(/\w/,"")}
Lo sentimos. no está familiarizado con JIRA ....
Puede usar chronic. Puede analizar prácticamente todo lo que truele, incluso "ayer", "la semana pasada", etc.
Actualización: Como señala el OP en el comentario, Crónico es para fechas, no para intervalos de tiempo. Ver mi otra respuesta.
escribí este método que lo hace bastante bien
def parse_duration(dur)
duration = 0
number_tokens = dur.gsub(/[a-z]/i,"").split
times = dur.gsub(/[\.0-9]/,"").split
if number_tokens.size != times.size
raise "unrecognised duration!"
else
dur_tokens = number_tokens.zip(times)
for d in dur_tokens
number_part = d[0].to_f
time_part = d[1]
case time_part.downcase
when "h","hour","hours"
duration += number_part.hours
when "m","minute","minutes","min","mins"
duration += number_part.minutes
when "d","day","days"
duration += number_part.days
when "w","week","weeks"
duration += number_part.weeks
when "month", "months"
duration += number_part.months
when "y", "year", "years"
duration += number_part.years
else
raise "unrecognised duration!"
end
end
end
duration
end
chronic_duration
hace esto.
- 1. Cómo analizar documentos de texto con ruby?
- 2. Cómo analizar eficazmente archivos de texto grandes en Ruby
- 3. ¿Cómo analizar los SMS entrantes en Android?
- 4. cómo analizar un argumento sin nombre con optparse de Ruby
- 5. Biblioteca para analizar SVG en Ruby o Python
- 6. Cómo analizar los datos de línea MICR?
- 7. Analizar un valor decimal de una Cadena en Ruby
- 8. Método para analizar el documento HTML en Ruby?
- 9. Cómo analizar los parámetros de URL en Clojure?
- 10. ¿Cómo funcionan los enumeradores en Ruby 1.9.1?
- 11. registro fatal/analizar los errores en PHP5
- 12. Cómo analizar WSDL en Java?
- 13. Cómo usar los argumentos variables con OptionParser de Ruby
- 14. Cómo analizar xmlwebservice en phonegap
- 15. Cómo analizar JSON en Android
- 16. Cómo analizar XML en php?
- 17. Cómo analizar un archivo yaml en hashs y/o matrices de ruby?
- 18. ¿Los módulos == mixins en ruby?
- 19. Cómo analizar los campos dinámicos JSON con GSON?
- 20. Cómo mantener los comentarios al analizar XML usando Python/elementtree
- 21. Cómo puedo analizar el archivo y los marcos H264
- 22. Cómo obtener GWT CSSResource para analizar los selectores no()
- 23. cómo analizar los datos xml usando el análisis libxml
- 24. ¿Qué es analizar/analizar?
- 25. ¿Cómo puedo analizar JSON en Perl?
- 26. Cómo analizar milisegundos?
- 27. Ruby: ¿Cómo analizar una cadena para sacar algo y asignarlo a una variable
- 28. no puede analizar los datos usando JavaScriptDateTimeConverter
- 29. Cómo analizar HTML mal formado en python
- 30. cómo analizar CustomWritable de texto en Hadoop
[Duración crónica] (https://github.com/hpoydar/chronic_duration) hace esto pero es más versátil y bien probado. – sj26