ActiveSupport समय पार्सिंग रेल?

वोट
30

रेल 'ActiveSupport मॉड्यूल तरीकों की एक संख्या के साथ builtin गहरे लाल रंग का समय वर्ग फैली हुई है।

विशेष रूप से, वहाँ to_formatted_sविधि है, जो आपको लिखने देता है Time.now.to_formatted_s(:db)डाटाबेस प्रारूप में नहीं बल्कि बदसूरत लिखने के लिए की तुलना में एक स्ट्रिंग प्राप्त करने के लिए, strftimeप्रारूप-तार हर जगह।

मेरे सवाल है, वहाँ पीछे की ओर जाने के लिए एक तरीका है?

की तरह कुछ Time.parse_formatted_s(:db)है जो डाटाबेस प्रारूप में एक स्ट्रिंग पार्स होगा, एक नया समय वस्तु लौटने। यह कुछ ऐसा है रेल प्रदान किया जाना चाहिए की तरह लगता है, लेकिन अगर यह है, मैं इसे नहीं मिल रहा।

मैं सिर्फ यह पता लगाने के लिए सक्षम नहीं हूँ, या मैं इसे अपने आप को लिखने के लिए की जरूरत है?

धन्यवाद

10/12/2008 को 00:52
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
55

यह (और मैं भी लिए देख रहा था) लग रहा है ActiveSupport पार्स तरीकों आप देख रहे हैं प्रदान करता है, सब के बाद! - कम से कम अगर स्ट्रिंग आप पार्स करने के लिए कोशिश कर रहे हैं एक मानक है, आईएसओ 8601 प्रारूपित ( :dbप्रारूप) तिथि।

तारीख आप पार्स करने के लिए कोशिश कर रहे हैं पहले से ही आपके स्थानीय समय क्षेत्र में है, तो यह वास्तव में आसान है!

 > 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

और कहा कि समय-क्षेत्र-अवगत समय तो आसानी से यूटीसी में बदला जा सकता

 > 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

दिनांक स्ट्रिंग आप पार्स करने के लिए कोशिश कर रहे हैं यूटीसी में है, तो दूसरी ओर, यह कोई विधि है जैसे कि यह पार्स करने के लिए नहीं लगता है सीधे एक TimeWithZone में है, लेकिन मैं चारों ओर है कि DateTime.strptime पहले होना का उपयोग कर काम करने में सक्षम था ...

तारीख आप पार्स करने के लिए कोशिश कर रहे हैं यूटीसी में है और आप इसे यूटीसी के रूप में रहना चाहते हैं, तो आप उपयोग कर सकते हैं:

 > DateTime.strptime('2009-09-24 08:28:43', '%Y-%m-%d %H:%M:%S').to_time
=> 2009-09-24 08:28:43 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