Ho un numero di secondi. Diciamo 270921. Come posso visualizzare quel numero dicendo che è xx giorni, yy ore, zz minuti, secondi ww?come convertire 270921sec in giorni + ore + minuti + secondi? (ruby)
risposta
Esso può essere fatto abbastanza conciso utilizzando divmod
:
t = 270921
mm, ss = t.divmod(60) #=> [4515, 21]
hh, mm = mm.divmod(60) #=> [75, 15]
dd, hh = hh.divmod(24) #=> [3, 3]
puts "%d days, %d hours, %d minutes and %d seconds" % [dd, hh, mm, ss]
#=> 3 days, 3 hours, 15 minutes and 21 seconds
Si potrebbe probabilmente asciugare ulteriormente ottenendo creativo con collect
, o forse inject
, ma quando la logica di base è tre linee potrebbe essere eccessivo.
Rails ha un helper che converte la distanza del tempo in parole. Si può guardare la sua attuazione: distance_of_time_in_words
C'è un modo per usarlo al di fuori di Rails? – Kostas
Sì. include ActionView :: Helpers :: DateHelper! –
a = distance_of_time_in_words (from_time, from_time + 50.minutes) => "circa 1 ora" 1.9.2-p290: 035> –
Speravo ci sarebbe un modo più semplice che usare divmod, ma questo è il modo più DRY e riutilizzabile ho trovato per farlo:
def seconds_to_units(seconds)
'%d days, %d hours, %d minutes, %d seconds' %
# the .reverse lets us put the larger units first for readability
[24,60,60].reverse.inject([seconds]) {|result, unitsize|
result[0,0] = result.shift.divmod(unitsize)
result
}
end
Il metodo è facilmente regolabile modificando la stringa di formato e il primo array inline (cioè [24,60,60]).
versione migliorata
class TieredUnitFormatter
# if you set this, '%d' must appear as many times as there are units
attr_accessor :format_string
def initialize(unit_names=%w(days hours minutes seconds), conversion_factors=[24, 60, 60])
@unit_names = unit_names
@factors = conversion_factors
@format_string = unit_names.map {|name| "%d #{name}" }.join(', ')
# the .reverse helps us iterate more effectively
@reversed_factors = @factors.reverse
end
# e.g. seconds
def format(smallest_unit_amount)
parts = split(smallest_unit_amount)
@format_string % parts
end
def split(smallest_unit_amount)
# go from smallest to largest unit
@reversed_factors.inject([smallest_unit_amount]) {|result, unitsize|
# Remove the most significant item (left side), convert it, then
# add the 2-element array to the left side of the result.
result[0,0] = result.shift.divmod(unitsize)
result
}
end
end
Esempi:
fmt = TieredUnitFormatter.new
fmt.format(270921) # => "3 days, 3 hours, 15 minutes, 21 seconds"
fmt = TieredUnitFormatter.new(%w(minutes seconds), [60])
fmt.format(5454) # => "90 minutes, 54 seconds"
fmt.format_string = '%d:%d'
fmt.format(5454) # => "90:54"
Nota che format_string
non ti consente di cambiare l'ordine delle parti (è sempre il valore più significativo al meno). Per un controllo a grana fine, puoi usare split
e manipolare i valori tu stesso.
Ho appena iniziato a scrivere rubino. Credo che questo è solo per 1.9.3
def dateBeautify(t)
cute_date=Array.new
tables=[ ["day", 24*60*60], ["hour", 60*60], ["minute", 60], ["sec", 1] ]
tables.each do |unit, value|
o = t.divmod(value)
p_unit = o[0] > 1 ? unit.pluralize : unit
cute_date.push("#{o[0]} #{unit}") unless o[0] == 0
t = o[1]
end
return cute_date.join(', ')
end
Se stai usando Rails, c'è un modo semplice, se non è necessario la precisione:
time_ago_in_words 270921.seconds.from_now
# => 3 days
grazie per aver sottolineato che le rotaie hanno questo – nXqd
bisogno di una pausa. Golfed questo in su:
s = 270921
dhms = [60,60,24].reduce([s]) { |m,o| m.unshift(m.shift.divmod(o)).flatten }
# => [3, 3, 15, 21]
È possibile utilizzare il metodo più semplice che ho trovato per questo problema:
def formatted_duration total_seconds
hours = total_seconds/(60 * 60)
minutes = (total_seconds/60) % 60
seconds = total_seconds % 60
"#{ hours } h #{ minutes } m #{ seconds } s"
end
È sempre possibile regolare valore restituito alle proprie esigenze.
2.2.2 :062 > formatted_duration 3661
=> "1 h 1 m 1 s"
- 1. Convertire secondi a giorni: ore: minuti: secondi
- 2. Convertire i secondi in giorni, minuti e ore in Oggettivo
- 3. R: Convertire ore: minuti: secondi
- 4. Giorni, ore, minuti, secondi tra due date
- 5. Come convertire secondi in ore, minuti e secondi?
- 6. Converti secondi in giorni, minuti e secondi
- 7. Javascript mostra millisecondi come giorni: ore: minuti senza secondi
- 8. Come analizzare giorni/ore/minuti/secondi nel rubino?
- 9. Javasacript Timer conto alla rovescia in giorni, ore, minuti, secondi
- 10. Come convertire secondi in minuti e ore in javascript
- 11. Oracle Converti secondi in ore: minuti: secondi
- 12. Conversione ore: minuti: secondi in minuti totali in excel
- 13. Convertire un timedelta in giorni, ore e minuti
- 14. NSNumero di secondi a Ore, minuti, secondi
- 15. Differenza tra datetimes in ore, minuti, secondi
- 16. Conversione dei secondi in ore, minuti e secondi
- 17. Converti C# .NET DateTime.ticks in giorni/ore/minuti in JavaScript
- 18. PHP - Convertire millisecondi a ore: minuti: Seconds.fractional
- 19. Semplicissimo modo di convertire HH: MM: SS (ore: minuti: secondi.split secondi) in secondi
- 20. Ottieni la differenza di data e ora in giorni, ore, minuti e secondi in Android
- 21. come mostrare millisecondi in giorni: ore: min: secondi
- 22. Come convertire i millisecondi in ore e giorni?
- 23. Converti decimale in ore Minuti e secondi in C# .Net
- 24. data di PHP() ore, minuti e secondi senza zeri
- 25. Quanto estrapolano anni, mesi, giorni, ore, minuti, secondi da una data mysql?
- 26. Php: DateTime: come impostare solo secondi (non ore né minuti)
- 27. formato di etichetta timer ore: minuti: secondi in Swift
- 28. Calcola DateDiff in SQL in Giorni: Ore: Min: Formato secondi
- 29. Come aggiungere Ore, minuti, secondi a dateadd sql?
- 30. Come convertire datetime.timedelta in minuti, ore in Python?
@ Mike Woodhouse: questo è quello che stavo cercando. Grazie. – Radek
ottima risposta - grazie. –
+1, Cosa succede se ho bisogno di mostrare i secondi fino a 90 minuti, ad esempio Im monitoraggio di un gioco. dovrebbe mostrare qualcosa come 90:54. Grazie! – uday