ruby on rails - रेल सक्रिय समर्थन समय पार्सिंग?




ruby-on-rails parsing (4)

ऐसा लगता है कि 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

यदि आप जिस दिनांक स्ट्रिंग को पार्स करने की कोशिश कर रहे हैं वह यूटीसी में है, दूसरी तरफ, ऐसा लगता है कि इसे सीधे टाइमविथज़ोन में पार्स करने के लिए कोई तरीका नहीं है, लेकिन मैं डेटटाइम.स्ट्रिप्टाइम का उपयोग करके पहले काम करने में सक्षम था ...

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

 > 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] [1 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

संदर्भ के लिए अधिक दस्तावेज लिंक:

रेल का सक्रिय समर्थन मॉड्यूल कई विधियों के साथ बिल्टिन रूबी टाइम क्लास को बढ़ाता है।

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

मेरा सवाल है, क्या पीछे जाने का कोई तरीका है?

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

क्या मैं इसे ढूंढने में सक्षम नहीं हूं, या मुझे इसे खुद लिखने की ज़रूरत है?

धन्यवाद


मैं बस इसमें भी भाग गया और उपरोक्त में से कोई भी जवाब मेरे लिए संतोषजनक नहीं था। आदर्श रूप से कोई भी ActiveSupport::TimeZone उपयोग Time और कॉल जैसे किसी भी मनमाना प्रारूप के साथ कर सकता है और सही TimeZone ऑब्जेक्ट वापस प्राप्त कर सकता है। ActiveSupport::TimeZone.strptime मौजूद नहीं है इसलिए मैंने इस बंदरगाह को बनाया है:

 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

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

जब तक आपकी तिथि कुछ अजीब प्रारूप में न हो, तब तक बढ़िया काम करता है।


ActiveSupport::TimeZone.new('UTC').parse('2009-09-23 09:18:08')
=> Wed, 23 Sep 2009 09:18:08 UTC +00:00




activesupport