Rails Active Zeit Parsing?

stimmen
30

Rails' Active Modul erweitert die eingebauten Rubin Time-Klasse mit einer Reihe von Methoden.

Bemerkenswerterweise gibt es die to_formatted_sMethode, die Sie schreiben kann Time.now.to_formatted_s(:db)erhalten eine Zeichenfolge im Datenbankformat, anstatt zu schreiben hässlich strftimeFormat-Strings überall.

Meine Frage ist, gibt es eine Möglichkeit, rückwärts zu gehen?

So etwas wie Time.parse_formatted_s(:db)der würde eine Zeichenfolge in Datenbank - Format analysieren, ein neues Time - Objekt zurück. Dies scheint wie etwas , das Schienen zur Verfügung stellen sollte, aber wenn es ist, ich kann es nicht finden.

Kann ich es einfach nicht finden, oder muss ich es selbst schreiben müssen?

Vielen Dank

Veröffentlicht am 10/12/2008 um 00:52
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
55

Es sieht aus wie Active die Parsing - Methoden tut bieten Sie suchen (und ich suchte auch), nachdem alle! - zumindest , wenn die Zeichenfolge , die Sie analysieren möchten , ist ein Standard, ISO-8601-Format ( :dbFormat) Datum.

Wenn das Datum Sie versuchen, ist bereits in Ihrer Zeitzone zu analysieren, ist es einfach!

 > Time.zone.parse('2009-09-24 08:28:43')
=> Thu, 24 Sep 2009 08:28:43 PDT -07:00

 > Time.zone.parse('2009-09-24 08:28:43').class
=> ActiveSupport::TimeWithZone

und dass zeitzonen bewusst Zeit kann dann leicht zu UTC umgewandelt werden

 > Time.zone.parse('2009-09-24 08:28:43').utc
=> 2009-09-24 15:28:43 UTC

oder zu anderen Zeitzonen:

 > ActiveSupport::TimeZone.us_zones.map(&:name)
=> ["Hawaii", "Alaska", "Pacific Time (US & Canada)", "Arizona", "Mountain Time (US & Canada)", "Central Time (US & Canada)", "Eastern Time (US & Canada)", "Indiana (East)"]

 > Time.zone.parse('2009-09-24 08:28:43').utc.in_time_zone('Eastern Time (US & Canada)')
=> Thu, 24 Sep 2009 11:28:43 EDT -04:00

Wenn die Datumszeichenfolge Sie versuchen , in UTC zu analysieren ist, auf der anderen Seite, ist es nicht so aus , wie es eine Methode ist es zu analysieren , direkt in eine TimeWithZone, aber ich war in der Lage sein , zunächst mit DateTime.strptime um dies zu arbeiten ...

Wenn das Datum Sie versuchen, in UTC zu analysieren ist, und Sie wollen es als UTC bleiben, können Sie:

 > DateTime.strptime('2009-09-24 08:28:43', '%Y-%m-%d %H:%M:%S').to_time
=> 2009-09-24 08:28:43 UTC

Wenn das Datum Sie versuchen, in UTC zu analysieren ist, und Sie wollen es zu einem Standard-Zeitzone umgewandelt, können Sie:

 > DateTime.strptime('2009-09-24 08:28:43', '%Y-%m-%d %H:%M:%S').to_time.in_time_zone
=> Thu, 24 Sep 2009 01:28:43 PDT -07:00

Es sieht aus wie es auch andere Formate analysieren kann, wie das seltsame Format, das Time # to_s produziert:

irb -> Time.zone.parse('Wed, 23 Sep 2009 02:18:08').to_s(:db)
    => "2009-09-23 09:18:08"

irb -> Time.zone.parse('Wed, 23 Sep 2009 02:18:08 EDT').to_s(:db)
    => "2009-09-23 06:18:08"

Ich bin sehr beeindruckt.

Hier sind einige weitere Beispiele aus [ http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html][1] :

  Time.zone = 'Eastern Time (US & Canada)'        # => 'Eastern Time (US & Canada)'
  Time.zone.local(2007, 2, 10, 15, 30, 45)        # => Sat, 10 Feb 2007 15:30:45 EST -05:00
  Time.zone.parse('2007-02-10 15:30:45')          # => Sat, 10 Feb 2007 15:30:45 EST -05:00
  Time.zone.at(1170361845)                        # => Sat, 10 Feb 2007 15:30:45 EST -05:00
  Time.zone.now                                   # => Sun, 18 May 2008 13:07:55 EDT -04:00
  Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone  # => Sat, 10 Feb 2007 15:30:45 EST -05:00

Weitere Dokumentation Links als Referenz:

Beantwortet am 24/09/2009 um 22:24
quelle vom benutzer

stimmen
5
ActiveSupport::TimeZone.new('UTC').parse('2009-09-23 09:18:08')
=> Wed, 23 Sep 2009 09:18:08 UTC +00:00
Beantwortet am 05/08/2010 um 17:17
quelle vom benutzer

stimmen
3

Rails 5 bietet endlich strptime!

value = '1999-12-31 14:00:00'
format = '%Y-%m-%d %H:%M:%S'
Time.zone.strptime(value, format)
# => Fri, 31 Dec 1999 14:00:00 HST -10:00

ActiveSupport::TimeZone.all.sample.strptime(value, format)
# => Fri, 31 Dec 1999 14:00:00 GST +04:00
Beantwortet am 07/02/2016 um 06:36
quelle vom benutzer

stimmen
2

Ich lief in dem so gut und keiner der oben genannten Antworten waren für mich zufriedenstellend. Im Idealfall könnte man verwenden , ActiveSupport::TimeZonewie Timeund rufen Sie .strptimemit jedem beliebigen Format auf sie und das richtige zurück TimeZoneObjekt. ActiveSupport::TimeZone.strptimenicht vorhanden ist, so habe ich diese monkeypatch:

 class ActiveSupport::TimeZone
    def strptime(str, fmt, now = self.now)
      date_parts = Date._strptime(str, fmt)
      return if date_parts.blank?
      time = Time.strptime(str, fmt, now) rescue DateTime.strptime(str, fmt, now)
      if date_parts[:offset].nil?
        ActiveSupport::TimeWithZone.new(nil, self, time)
      else
        time.in_time_zone(self)
      end
    end
  end
Beantwortet am 17/05/2012 um 23:37
quelle vom benutzer

stimmen
1
>> "2009-09-24".to_date
=> Thu, 24 Sep 2009
>> "9/24/2009".to_date
=> Thu, 24 Sep 2009

Funktioniert prima, wenn Ihr Datum in einigen seltsamen Format ist.

Beantwortet am 25/09/2009 um 02:40
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more