C'è una gemma o qualcosa da analizzare stringhe come "4h 30m" "1d 4h" - un po 'come le stime in JIRA o programmatori di compiti, forse, con l'internazionalizzazione?Come analizzare giorni/ore/minuti/secondi nel rubino?
risposta
Inviare una seconda risposta, come cronica (che la mia risposta originale suggerito) non ti dà timespans ma timestamp.
Ecco il mio passaggio su un parser.
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 strategia è abbastanza semplice. Dividere "5h"
in ["5", "h"]
, definire quanti secondi "h"
rappresenta (TOKENS
) e aggiungere tale importo 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
Non dovrebbe essere troppo difficile fare maneggia "1.5h"
sia, vedendo il codice di base è semplice come è.
Parse in cosa?
Questo analizzerà in un hash:
"4h 30m".split(/\s/).each{|i| h[i.gsub(/\d+/,"")] = i.gsub(/\w/,"")}
spiacenti. non ha familiarità con JIRA ....
È possibile utilizzare chronic. È in grado di analizzare praticamente tutto ciò che viene visualizzato, tra cui "ieri", "la scorsa settimana" ecc.
Aggiornamento: Come l'OP indica nel commento, Chronic è per le date, non i tempi. Vedi la mia altra risposta.
ho scritto questo metodo che lo fa piuttosto bene
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
fa questo.
- 1. Rubino stringa di analizzare
- 2. Come analizzare YAML nel browser?
- 3. Come decomprimere la stringa Gzip nel rubino?
- 4. come mettere le asserzioni nel codice rubino
- 5. Come fare la firma xml nel rubino
- 6. Come analizzare XML nel backend Meteor?
- 7. Rails come analizzare il testo/event-stream?
- 8. Recupero da mancata richiesta/carico nel rubino
- 9. rubino iniettare con condizionale nel blocco?
- 10. Come ottenere un elenco di fusi orari nel rubino?
- 11. Come modificare le rotte nel rubino sulle rotaie?
- 12. Rubino array - come posso fare valori persistono nel nulla Valori
- 13. Come ottenere i primi n elementi da Hash nel rubino?
- 14. Python: Come posso analizzare {apple: "1", arancione: "2"} nel dizionario?
- 15. Come analizzare un URL di dati nel nodo?
- 16. Gioiello rubino rubino
- 17. analizzare una data in rotaie
- 18. Come trovo l'interprete rubino?
- 19. Come squish in rubino
- 20. Rubino: come tornare indietro?
- 21. Scritto rubino come servizio
- 22. parse JSON di opporsi rubino
- 23. Come analizzare BaseHTTPRequestHandler.path
- 24. Come analizzare core dump
- 25. Impossibile analizzare come intero
- 26. Come analizzare JSON (AS3)
- 27. Come analizzare XML SOAP?
- 28. Come analizzare un file JSON?
- 29. come analizzare la memoria golang
- 30. Perché la profilazione della memoria nel rubino è così difficile?
[durata cronica] (https://github.com/hpoydar/chronic_duration) lo fa ma è più versatile e ben testato. – sj26