रूबी में यूटीसी टाइमस्टैम्प को आईएसओ 8601 में परिवर्तित करना


85

मेरे पास एक टाइमस्टैम्प है जो यूटीसी में है

"2010-10-25 23:48:46 यूटीसी"

मुझे इसे आईएसओ 8601 में बदलने की आवश्यकता है

"2010-10-29 06: 09Z"

प्रलेखन नरक के रूप में भ्रमित कर रहा है - ऐसा करने का सबसे आसान तरीका क्या है?

जवाबों:


185

मुझे लगता है कि आप हमें बरगला रहे हैं।

आपके प्रश्न की इनपुट तिथि 25 अक्टूबर, 2010 है , जबकि आउटपुट 29 अक्टूबर, 2010 है । बहुत बढ़िया!

इस नाइट-पिकिंग थ्रेड पर जारी रहना: आपका समय भी पूरी तरह से अलग है और आप आउटपुट समय से सेकंड याद कर रहे हैं।

अब सच्चे उत्तर के लिए।

थोड़ा फैक्टॉइड हालांकि पहले: रूबी में आईएसओ 8601 आउटपुट आईएसओ 8601 के विकिपीडिया पृष्ठ से "संयुक्त तिथि और समय" आउटपुट के समान है ।

आपको एक स्ट्रिंग मिली है और इसलिए आपको इसे एक Timeऑब्जेक्ट में बदलने की आवश्यकता होगी जिसे आप कर सकते हैं to_time। फिर यह iso8601आईएसओ 8601 संस्करण प्राप्त करने के लिए उस वस्तु पर कॉल करने की बात है :

"2010-10-25 23:48:46 UTC".to_time.iso8601

to_timeजबकि विधि, रेल के सौजन्य से है iso8601रूबी के मानक पुस्तकालय के सौजन्य से है।


7
अच्छा जवाब, लेकिन मुझे पहला भाग नहीं मिला (क्या यह हास्य होना चाहिए?)
मार्क थॉमस

5
अरे नहीं! तुम मेरी साजिश के माध्यम से देखा तुम लोगों को धोखा देने के लिए। = पी महान जवाब के लिए धन्यवाद, मुझे आश्चर्य है कि वे सिर्फ दस्तावेज में क्यों नहीं लिखते हैं!
यिंग

13
@ मर्क थॉमस: हाँ यह हास्य होना चाहिए था। उन्होंने एक इनपुट और एक आउटपुट टाइम दिया जो कभी मेल नहीं खाता। ट्रिकी थोड़ा शौक!
रयान बिग बिग

यह काम करता है, लेकिन हालांकि उनके सवाल ने पूछा कि इसे माणिक में कैसे करना है, यह नहीं माना कि यह रेल के वातावरण में था।
21

1
संबंधित, मुझे 'to_time' पर इंगित करने के लिए धन्यवाद ~ Time.now.iso8601 प्रारूप जैसे "2010-10-25T23: 48: 46Z", यदि आप 'Z' के बजाय '+00: 00' का उपयोग करना चाहते हैं (जो मैंने किया था) एक विरासत प्रणाली के लिए) Time.now.to_time.iso8601 ऐसा करने के लिए प्रकट होता है।
लुसीजेनिक

21

बहुत प्रयोग करने के बाद, मुझे टाइम लाइब्रेरी का पार्सर डेटाइम से बेहतर लगता है, हालाँकि इसके कारण मुझे फिलहाल बच जाते हैं। उस चेतावनी के साथ, मैं हमेशा इस तरह के सामान के लिए डेटटाइम के बजाय समय का उपयोग करता हूं, और रूबी प्रलेखन भी मुश्किल है क्योंकि यह ऐसा क्यों है,

require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"

5
अच्छा शुद्ध रूबी घोल। बस जोड़ना चाहते हैं, यदि मूल समय यूटीसी नहीं है, तो आप यह चाहते हो सकते हैं: इसके अलावा Time.parse("...").utc.iso8601, आपको समय के साथ प्रत्यय के समय मिलेगा +03:00या कुछ अन्य मूल्य के आधार पर टाइमज़ोन मूल समय स्ट्रिंग के साथ दिया गया है। मैं इसके बजाय मतलब है Z
अकोस्टादीनोव

4

नोट: आपको to_time पद्धति को लागू करने से पहले एक टाइम स्ट्रिंग को टाइम ऑब्जेक्ट में बदलना (पार्स करना) है।

ruby-1.9.2-p180 :016 > "2010-10-25 23:48:46 UTC".to_time.iso8601
NoMethodError: undefined method `to_time' for "2010-10-25 23:48:46 UTC":String
    from (irb):16

सही प्रक्रिया:

irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")

irb> ut.iso8601
 => "2010-10-25T23:48:46+00:00" 

1

इस पुराने पुराने प्रश्न का उत्तर जोड़ना क्योंकि यदि आप रेल का उपयोग कर रहे हैं, तो इसे परिवर्तित करने / पार्स करने की कोई आवश्यकता नहीं है जिस तरह से अन्य उत्तर यहां आपको करने के लिए कह रहे हैं:

  • यदि यह पहले से ही एक टाइमस्टैम्प (जैसे, created_atया updated_atविशेषता) है, तो आप सीधेiso8601 उस टाइमस्टैम्प (जैसे, object.created_at.iso8601) पर विधि को कॉल कर सकते हैं
  • iso8601विधि को भी दशमलव अंक प्रदर्शित करने के लिए एक संख्यात्मक तर्क स्वीकार करता है; यदि आप 2020-04-06T19:16:55.604Zइसके बजाय चाहते हैं तो आप इसका उपयोग करेंगे 2020-04-06T19:16:55Z

https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.