3 Stimmen

Ruby (mit Rails) konvertieren eine Zeichenfolge der Zeit in Sekunden?

Ich habe also eine Reihe von Zeitvorgaben... etwa in der Größenordnung von

'4 hours'
'48 hours'
'3 days'
'15 minutes'

Ich möchte sie alle in Sekunden umrechnen. Für '4 hours' funktioniert dies problemlos.

Time.parse('4 hours').to_i - Time.parse('0 hours').to_i
=> 14400 # 4 hours in seconds, yay

Dies funktioniert jedoch 48 Stunden lang nicht (Fehler außerhalb des Bereichs). Es funktioniert auch nicht für 3 Tage (kein Informationsfehler), usw.

Gibt es eine einfache Möglichkeit, diese Zeichenfolgen in Sekunden umzuwandeln?


6voto

coreyward Punkte 72986

Was Sie von Ruby mit Time.parse verlangen, ist die Bestimmung einer Tageszeit. Das ist nicht das, was Sie wollen. Alle Bibliotheken, die mir einfallen, sind in diesem Punkt ähnlich: Sie sind an absoluten Zeiten interessiert, nicht an Zeitabschnitten.

Um Ihre Zeichenketten in Zeitformate zu konvertieren, mit denen wir arbeiten können, empfehle ich die Verwendung von Chronic ( gem install chronic ). Um in Sekunden umzurechnen, können wir alles relativ zur aktuellen Zeit machen und dann diese Zeit subtrahieren, um die absolute Anzahl der Sekunden zu erhalten, wie gewünscht.

def seconds_in(time)
    now = Time.now
    Chronic.parse("#{time} from now", :now => now) - now
end

seconds_in '48 hours'   # => 172,800.0
seconds_in '15 minutes' # => 900.0
seconds_in 'a lifetime' # NoMethodError, not 42 ;)

Ein paar kurze Anmerkungen:

  • En from now ist der Grund, warum Chronic benötigt wird - es verarbeitet natürlichsprachliche Eingaben.
  • Wir geben an now um vor dem Fall sicher zu sein, dass sich Time.now zwischen dem Zeitpunkt, an dem Chronic seine Magie einsetzt, und dem Zeitpunkt, an dem wir es vom Ergebnis subtrahieren, ändert. Das wird vielleicht nie passieren, aber sicher ist sicher, denke ich.

0 Stimmen

Auch hier würde ich mich für Chronic entscheiden.

1 Stimmen

Chronic wird funktionieren, aber Chronic Duration kann das Leben einfacher machen. Haben Sie github.com/hpoydar/chronic_duration . Ein schöner Blog-Artikel über das Parsen von Datum und Uhrzeit - everydayrails.com/2010/08/11/

0 Stimmen

@Gokul Sieht hilfreich aus. Die API ist allerdings etwas grell.

4voto

mark Punkte 10028
4.hours => 14400 seconds
4.hours.to_i 14400
4.hours - 0.hours => 14400 seconds 

def string_to_seconds string
  string.split(' ')[0].to_i.send(string.split(' ')[1]).to_i
end

Diese Hilfsmethode funktioniert nur, wenn die Zeit im Format Zahl[Leerzeichen]Stunde(n)/Minute(n)/Sekunde(n) angegeben wird.

0 Stimmen

Sie beginnen mit einer Fixnum, aber ich denke, er beginnt mit der Eingabe von Zeichenketten durch den Benutzer.

0 Stimmen

Ja, um ehrlich zu sein, habe ich das erst jetzt bemerkt und vorhin überflogen. Having said that, es scheint mir, wenn die Zeit Zeichenfolgen immer in der beschriebenen konsistenten Format dann warum nicht die Zeichenfolge analysieren und Schienen datetime Helfer verwenden werden.

4voto

Heikki Punkte 15089
'48 hours'.match(/^(\d+) (minutes|hours|days)$/) ? $1.to_i.send($2) : 'Unknown'
 => 172800 seconds

0 Stimmen

Dies wird nicht funktionieren: 'ein Tag', 'ein Tag', '1 Woche', '1 Monat', '48 Stunden' usw. Dies ist ein Schritt nach vorn gegenüber def solve_complex_problem; return 'answer'; end .

0 Stimmen

Ja, aber an den Beispielen in der Frage vorbei. Ich verstehe den zweiten Satz nicht.

1 Stimmen

Haben Sie schon einmal einen Programmierkurs belegt, in dem Ihnen gesagt wurde, dass Sie eine Anwendung schreiben müssen, die auf eine bestimmte Weise reagiert? Der Punkt ist, dass Sie die Anwendung nicht so schreiben sollten, dass sie buchstäblich auf die Beispiele reagiert, sondern dass Sie ableiten sollten, was Funktion sie durchführen soll und schreiben Sie sie als solche.

2voto

Gokul Punkte 2286

Chronisch geht auch, aber Chronische Dauer ist besser geeignet. Es kann eine Zeichenkette analysieren und Ihnen Sekunden geben.

require "chronic_duration"
ChronicDuration::parse('15 minutes')
# or 
ChronicDuration::parse('4 hours') 

http://everydayrails.com/2010/08/11/ruby-date-time-parsing-chronic.html

1voto

Zabba Punkte 62188

Ich bin mir sicher, dass Sie damit gute Arbeit leisten können. chronisch gem.

Außerdem finden Sie hier einige gut zu wissen, Informationen über Daten / Zeiten in Ruby

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X