ActiveSupport Zaman Ayrıştırma Raylar?

oy
30

Rails'in ActiveSupport modülü bir dizi yöntem ile yerleşik yakut Zaman sınıfını genişletir.

Özellikle, orada to_formatted_syazdığınız sağlayan yöntem, Time.now.to_formatted_s(:db)oldukça çirkin yazmak zorunda kalmak yerine Veritabanı formatında bir dize almak için strftimeher yerde biçim-dizeleri.

Sorum geriye gitmek için bir yol var, nedir?

Böyle bir şey Time.parse_formatted_s(:db), yeni bir Zaman nesnesi dönen, Veritabanı formatında bir dize ayrıştırma. Bu raylar temin edilmesi gereken bir şey gibi görünüyor, ama eğer, ben bulamıyorum.

Onu bulmak için sadece mümkün değil miyim, yoksa kendim yazmak gerekiyor?

Teşekkürler

Oluştur 10/12/2008 saat 00:52
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
55

ActiveSupport Aradığınız ayrıştırma yöntemlerini sağlamaz gibi görünüyor (ve ben de arıyordu), ne de olsa! - Eğer ayrıştırmak çalıştığınız dize bir standarttır en azından eğer, ISO-8601-biçimlendirilmiş ( :dbbiçimi) tarihi.

ayrıştırmaya çalıştığınız olduğunuz tarih, yerel saat diliminde zaten varsa, gerçekten kolay!

 > 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

ve bu zaman dilimi farkında zaman sonra kolayca UTC dönüştürülebilir

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

ya da diğer zaman dilimleri için:

 > 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

Ayrıştırmaya çalıştığınız olduğunuz tarih dizesi UTC ise, diğer taraftan, bunu ayrıştırmak için herhangi bir yöntem var gibi görünmüyor doğrudan bir TimeWithZone içine ama bunun olması ilk kullanan DateTime.strptime geçici başardı ...

ayrıştırmaya çalıştığınız olduğunuz tarih UTC ve bunu UTC olarak kalmak istiyorsanız, şunları kullanabilirsiniz:

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

ayrıştırmaya çalıştığınız olduğunuz tarih UTC olduğunu ve bu varsayılan saat dilimine dönüştürülür istiyorsanız kullanabilirsiniz:

 > 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

O bile böyle Süresi # to_s üreten garip biçimi gibi diğer biçimleri, ayrıştırabilir benziyor:

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"

Oldukça etkilendim.

İşte [dan daha fazla örnek bulabilirsiniz 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

Daha dokümantasyon referans için bağlantılar:

Cevap 24/09/2009 saat 22:24
kaynak kullanıcı

oy
5
ActiveSupport::TimeZone.new('UTC').parse('2009-09-23 09:18:08')
=> Wed, 23 Sep 2009 09:18:08 UTC +00:00
Cevap 05/08/2010 saat 17:17
kaynak kullanıcı

oy
3

Raylar 5 nihayet sağlar 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
Cevap 07/02/2016 saat 06:36
kaynak kullanıcı

oy
2

Sadece de bu koştu ve yukarıdaki cevapların hiçbiri bana tatmin edici idi. İdeal bir kullanabiliriz ActiveSupport::TimeZonegibi Timeve çağrı .strptimerasgele formatı ile üzerine doğru geri almak TimeZonenesne. ActiveSupport::TimeZone.strptimeBu monkeypatch yarattı yüzden yok:

 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
Cevap 17/05/2012 saat 23:37
kaynak kullanıcı

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

Tarih bazı garip biçimde olmadığı sürece oldukça uygundur.

Cevap 25/09/2009 saat 02:40
kaynak kullanıcı

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