Ράγες ActiveSupport Ώρα Parsing;

ψήφοι
30

ενότητα ActiveSupport Rails' επεκτείνει τη ενσωματωμένες τάξη ρουμπίνι φορά με διάφορες μεθόδους.

Αξίζει να σημειωθεί ότι, υπάρχει η to_formatted_sμέθοδος, η οποία σας επιτρέπει να γράφετε Time.now.to_formatted_s(:db)για να πάρει ένα string σε μορφή βάσης δεδομένων, αντί να χρειάζεται να γράψετε άσχημο strftimeσχήμα-strings παντού.

Η ερώτησή μου είναι, είναι ένας τρόπος για να πάει πίσω εκεί;

Κάτι σαν Time.parse_formatted_s(:db)τα οποία θα αναλύσει μια σειρά σε μορφή βάσης δεδομένων, επιστρέφει ένα νέο αντικείμενο χρόνου. Αυτό φαίνεται σαν κάτι που ράγες θα πρέπει να παρέχει, αλλά αν είναι, δεν μπορώ να το βρω.

Είμαι απλά δεν είναι σε θέση να το βρείτε, ή θα πρέπει να το γράψω εγώ;

Ευχαριστώ

Δημοσιεύθηκε 10/12/2008 στις 00:52
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
55

Μοιάζει ActiveSupport δεν παρέχουν τις μεθόδους ανάλυσης που ψάχνετε (και έψαχνα για πολύ), μετά από όλα! - τουλάχιστον αν το string που προσπαθείτε να αναλύσει είναι ένα πρότυπο, ISO-8601-διαμορφωθεί ( :dbformat) την ημερομηνία.

Εάν η ημερομηνία που προσπαθείτε να αναλύσει είναι ήδη στην τοπική ζώνη ώρας σας, είναι πολύ εύκολο!

 > 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

και ότι ο χρόνος-ζώνη-επίγνωση του χρόνου μπορεί τότε εύκολα να μετατραπεί σε UTC

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

ή σε άλλες ζώνες ώρας:

 > 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

Αν το string ημερομηνία που προσπαθείτε να αναλύσει είναι σε UTC, από την άλλη πλευρά, δεν φαίνεται σαν να υπάρχει οποιαδήποτε μέθοδο για να το αναλύσει άμεσα σε TimeWithZone, αλλά ήμουν σε θέση να επιλύσετε αυτό να είναι η πρώτη χρήση DateTime.strptime ...

Εάν η ημερομηνία που προσπαθείτε να αναλύσει είναι σε UTC και θέλετε να μείνετε όπως UTC, μπορείτε να χρησιμοποιήσετε:

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

Εάν η ημερομηνία που προσπαθείτε να αναλύσει είναι σε UTC και θέλετε να μετατραπεί σε προεπιλεγμένη ζώνη ώρας σας, μπορείτε να χρησιμοποιήσετε:

 > 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

Φαίνεται σαν να μπορεί να αναλύσει ακόμα και άλλες μορφές, όπως η παράξενη μορφή που παράγει Ώρα # to_s:

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"

Είμαι πολύ εντυπωσιασμένος.

Εδώ είναι μερικά ακόμη παραδείγματα από την [ 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

Περισσότερα τεκμηρίωση συνδέσεις για την αναφορά:

Απαντήθηκε 24/09/2009 στις 22:24
πηγή χρήστη

ψήφοι
5
ActiveSupport::TimeZone.new('UTC').parse('2009-09-23 09:18:08')
=> Wed, 23 Sep 2009 09:18:08 UTC +00:00
Απαντήθηκε 05/08/2010 στις 17:17
πηγή χρήστη

ψήφοι
3

Ράγες 5 παρέχει τελικά 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
Απαντήθηκε 07/02/2016 στις 06:36
πηγή χρήστη

ψήφοι
2

Απλά έτρεξε σε αυτό, καθώς και καμία από τις παραπάνω απαντήσεις ήταν ικανοποιητικές για μένα. Ιδανικά θα μπορούσε κανείς να χρησιμοποιήσει ActiveSupport::TimeZoneακριβώς όπως Timeκαι να καλέσει .strptimeσε αυτό με οποιαδήποτε αυθαίρετη μορφή και να πάρει πίσω το σωστό TimeZoneαντικείμενο. ActiveSupport::TimeZone.strptimeδεν υπάρχει γι 'αυτό δημιούργησε αυτό το 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
Απαντήθηκε 17/05/2012 στις 23:37
πηγή χρήστη

ψήφοι
1
>> "2009-09-24".to_date
=> Thu, 24 Sep 2009
>> "9/24/2009".to_date
=> Thu, 24 Sep 2009

Δουλεύει άψογα, εκτός εάν η ημερομηνία σας είναι σε κάποιο παράξενο σχήμα.

Απαντήθηκε 25/09/2009 στις 02:40
πηγή χρήστη

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