Ruby DateTime को यूनिक्स टाइमस्टैम्प (सेकंड के बाद से सेकंड) कैसे कन्वर्ट करें?


369

रूबी डेटाइम को आप यूनिक्स टाइमस्टैम्प (सेकंड के बाद से सेकंड) में कैसे परिवर्तित करते हैं?

जवाबों:


354

DateTime.strptimeयुग के बाद से सेकंड संभाल सकते हैं। संख्या को एक स्ट्रिंग में परिवर्तित किया जाना चाहिए:

require 'date'
DateTime.strptime("1318996912",'%s')

4
यह आंशिक सेकंड नहीं संभालता है
Dan Sandberg

45
यह 'थियो' के साथ मिलिसेकंड संभालती है %Q
मिनी जॉन

3
@MiniJohn के उत्तर का अनुसरण करने के लिए। ऐसा लगता Timeहै कि इसके बजाय आवश्यक है DateTime। इसलिए उपयोग करें Time.strptime("1318996912345",'%Q').to_fऔर आप मिलीसेकंड को संरक्षित रखेंगे, जबकि DateTime.strptime("1318996912345",'%Q').to_fयह संरक्षित नहीं करता है।
स्केनसेल

625

क्षमा करें, श्लेष विफलता का संक्षिप्त क्षण। यहाँ असली जवाब है।

require 'date'

Time.at(seconds_since_epoch_integer).to_datetime

संक्षिप्त उदाहरण (यह मौजूदा सिस्टम टाइमज़ोन को ध्यान में रखता है):

$ date +%s
1318996912

$ irb

ruby-1.9.2-p180 :001 > require 'date'
 => true 

ruby-1.9.2-p180 :002 > Time.at(1318996912).to_datetime
 => #<DateTime: 2011-10-18T23:01:52-05:00 (13261609807/5400,-5/24,2299161)> 

आगे की अपडेट (UTC के लिए):

ruby-1.9.2-p180 :003 > Time.at(1318996912).utc.to_datetime
 => #<DateTime: 2011-10-19T04:01:52+00:00 (13261609807/5400,0/1,2299161)>

हालिया अपडेट : मैंने एक या दो सप्ताह पहले HA सेवा पर काम करते समय इस थ्रेड में शीर्ष समाधानों को बेंचमार्क किया था, और उस Time.at(..)आउटपरफॉर्म DateTime.strptime(..)(अपडेट: अतिरिक्त बेंचमार्क) को पाकर आश्चर्यचकित था ।

# ~ % ruby -v
#  => ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin13.0]

irb(main):038:0> Benchmark.measure do
irb(main):039:1*   ["1318996912", "1318496912"].each do |s|
irb(main):040:2*     DateTime.strptime(s, '%s')
irb(main):041:2>   end
irb(main):042:1> end

=> #<Benchmark ... @real=2.9e-05 ... @total=0.0>

irb(main):044:0> Benchmark.measure do
irb(main):045:1>   [1318996912, 1318496912].each do |i|
irb(main):046:2>     DateTime.strptime(i.to_s, '%s')
irb(main):047:2>   end
irb(main):048:1> end

=> #<Benchmark ... @real=2.0e-05 ... @total=0.0>

irb(main):050:0* Benchmark.measure do
irb(main):051:1*   ["1318996912", "1318496912"].each do |s|
irb(main):052:2*     Time.at(s.to_i).to_datetime
irb(main):053:2>   end
irb(main):054:1> end

=> #<Benchmark ... @real=1.5e-05 ... @total=0.0>

irb(main):056:0* Benchmark.measure do
irb(main):057:1*   [1318996912, 1318496912].each do |i|
irb(main):058:2*     Time.at(i).to_datetime
irb(main):059:2>   end
irb(main):060:1> end

=> #<Benchmark ... @real=2.0e-05 ... @total=0.0>

1
धन्यवाद ... निम्नलिखित उत्तर थोड़ा अधिक रसीला है, मैंने Time.at पाया लेकिन एक DateTime के समकक्ष खोजने की कोशिश कर रहा था।
ट्रॉनथन

27
यह अजीब है, लेकिन Time.at ()। To_datetime, DateTime.strptime () की तुलना में अधिक सुखद लगता है, केवल पठनीयता के कारण ... कम से कम मेरे लिए वैसे भी
tybro0103

34
यह उपरोक्त aser जैसा नहीं है, Time.at वर्तमान टाइमज़ोन को मानता है, जहाँ DateTime.strptime UTC का उपयोग करता है।
विटाली बाबई

5
यह बहुत आश्चर्य की बात नहीं है कि Time.atoutperforms DateTime.strptime। उत्तरार्द्ध को एक स्ट्रिंग को पार्स करना पड़ता है, जो आमतौर पर सीधे संख्या में लेने की तुलना में बहुत धीमा होता है।
पंजा

2
आपका बेंचमार्क बिल्कुल परीक्षण नहीं है DateTime.strptimeक्योंकि यह हर पुनरावृत्ति को दो नए स्ट्रिंग्स बना रहा है जो बहुत महंगा है। यह सिर्फ स्ट्रिंग नहीं है जैसे @claw ने कहा
वाटसैबॉक्स

67

समय क्षेत्र से निपटने

मैं सिर्फ स्पष्ट करना चाहता हूं, भले ही इस पर टिप्पणी की गई हो, लेकिन भविष्य के लोग इस बहुत महत्वपूर्ण अंतर को याद नहीं करते हैं।

DateTime.strptime("1318996912",'%s') # => Wed, 19 Oct 2011 04:01:52 +0000

UTC में एक रिटर्न मान प्रदर्शित करता है और स्ट्रिंग होने के लिए सेकंड की आवश्यकता होती है और UTC टाइम ऑब्जेक्ट को आउटपुट करता है, जबकि

Time.at(1318996912) # => 2011-10-19 00:01:52 -0400

LOCAL समय क्षेत्र में एक रिटर्न मान प्रदर्शित करता है, सामान्य रूप से FixNum तर्क की आवश्यकता होती है, लेकिन समय ऑब्जेक्ट अभी भी UTC में है भले ही प्रदर्शन नहीं है।

इसलिए भले ही मैंने दोनों विधियों में एक ही पूर्णांक पारित किया हो, लेकिन कक्षा के #to_sतरीके के काम करने के कारण मुझे दो अलग-अलग परिणाम प्रतीत होते हैं । हालाँकि, @Eero को मुझे दो बार याद दिलाना पड़ा:

Time.at(1318996912) == DateTime.strptime("1318996912",'%s') # => true

दो वापसी मूल्यों के बीच एक समानता की तुलना अभी भी सच है। फिर, इसका कारण यह है कि मूल्य मूल रूप से एक ही हैं (हालांकि विभिन्न वर्गों, #==विधि आपके लिए इस बात का ध्यान रखती है), लेकिन #to_sविधि बहुत अलग तार प्रिंट करती है। यद्यपि, यदि हम तारों को देखते हैं, तो हम देख सकते हैं कि वे वास्तव में एक ही समय हैं, बस अलग-अलग समय क्षेत्रों में मुद्रित होते हैं।

विधि तर्क स्पष्टीकरण

डॉक्स यह भी कहते हैं "यदि एक संख्यात्मक तर्क दिया जाता है, तो परिणाम स्थानीय समय में होता है।" जो समझ में आता है, लेकिन मेरे लिए थोड़ा भ्रमित था क्योंकि वे डॉक्स में गैर-पूर्णांक तर्कों का कोई उदाहरण नहीं देते हैं। तो, कुछ गैर-पूर्णांक तर्क उदाहरणों के लिए:

Time.at("1318996912")
TypeError: can't convert String into an exact number

आप स्ट्रिंग तर्क का उपयोग नहीं कर सकते हैं, लेकिन आप समय तर्क का उपयोग कर सकते हैं Time.atऔर यह परिणाम तर्क के समय क्षेत्र में लौटाएगा:

Time.at(Time.new(2007,11,1,15,25,0, "+09:00"))
=> 2007-11-01 15:25:00 +0900

मानक

उनके उत्तर पर @AdamEberlin के साथ एक चर्चा के बाद, मैंने सब कुछ यथासंभव समान बनाने के लिए थोड़ा परिवर्तित बेंचमार्क प्रकाशित करने का निर्णय लिया। इसके अलावा, मैं कभी भी इनका दोबारा निर्माण नहीं करना चाहता, इसलिए यह उतना ही अच्छा है जितना कि इन्हें बचाना।

Time.at (int) .to_datetime ~ 2.8x तेज

09:10:58-watsw018:~$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
09:11:00-watsw018:~$ irb
irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> require 'date'
=> true
irb(main):003:0>
irb(main):004:0* format = '%s'
=> "%s"
irb(main):005:0> times = ['1318996912', '1318496913']
=> ["1318996912", "1318496913"]
irb(main):006:0> int_times = times.map(&:to_i)
=> [1318996912, 1318496913]
irb(main):007:0>
irb(main):008:0* datetime_from_strptime = DateTime.strptime(times.first, format)
=> #<DateTime: 2011-10-19T04:01:52+00:00 ((2455854j,14512s,0n),+0s,2299161j)>
irb(main):009:0> datetime_from_time = Time.at(int_times.first).to_datetime
=> #<DateTime: 2011-10-19T00:01:52-04:00 ((2455854j,14512s,0n),-14400s,2299161j)>
irb(main):010:0>
irb(main):011:0* datetime_from_strptime === datetime_from_time
=> true
irb(main):012:0>
irb(main):013:0* Benchmark.measure do
irb(main):014:1*   100_000.times {
irb(main):015:2*     times.each do |i|
irb(main):016:3*       DateTime.strptime(i, format)
irb(main):017:3>     end
irb(main):018:2>   }
irb(main):019:1> end
=> #<Benchmark::Tms:0x00007fbdc18f0d28 @label="", @real=0.8680500000045868, @cstime=0.0, @cutime=0.0, @stime=0.009999999999999998, @utime=0.86, @total=0.87>
irb(main):020:0>
irb(main):021:0* Benchmark.measure do
irb(main):022:1*   100_000.times {
irb(main):023:2*     int_times.each do |i|
irb(main):024:3*       Time.at(i).to_datetime
irb(main):025:3>     end
irb(main):026:2>   }
irb(main):027:1> end
=> #<Benchmark::Tms:0x00007fbdc3108be0 @label="", @real=0.33059399999910966, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.32000000000000006, @total=0.32000000000000006>

**** हर तरह से पूरी तरह से गलत नहीं होने के लिए संपादित किया गया ****

**** ने मानदंड जोड़े ****


3
प्रशंसनीय लगता है, और मैं पहले से ही upvot (अब रद्द नहीं कर सकता), लेकिन आगे UTC के बारे में आपके दावे की जाँच करना असत्य है। परिणामी DateTime / समय ऑब्जेक्ट UTC बनाम स्थानीय में होगा, हाँ, लेकिन मूल टाइमस्टैम्प की व्याख्या दोनों मामलों में UTC में होने के नाते की जाती है! इसलिए समय का क्षण विधि की परवाह किए बिना समान है। Time.at(1318996912) == DateTime.strptime("1318996912",'%s')एक गैर-यूटीसी समयक्षेत्र में प्रयास करें और आप देखेंगे!
ईरो

4
मुझे क्षमा करें, लेकिन आपने जो सही किया वह अभी भी गलत है! :-) Time.use_zone "Samoa" do Time.at(1318996912) == DateTime.strptime("1318996912",'%s') endयह सत्यापित करने के लिए कि समय बराबर हैं, कोई LOCAL टाइमस्टैम्प नहीं है, और दोनों ही मामलों में Unix टाइमस्टैम्प की व्याख्या UTC में होने के नाते की जाती है। Time.at प्रस्तुत स्थानीय समय क्षेत्र में जिसके परिणामस्वरूप समय वस्तु, और DateTime.strptime प्रस्तुत यूटीसी में जिसके परिणामस्वरूप दिनांक समय वस्तु है, लेकिन प्रस्तुति की परवाह किए बिना वे बराबर हैं, के रूप में वे कुछ ही समय में बराबर पल रहे हैं।
ईरो

बयान जबकि Time.at(1318996912) # => 2011-10-19 00:01:52 -0400प्रदर्शित करता है स्थानीय समय क्षेत्र में एक वापसी मान सटीक होना प्रतीत नहीं होता है ... आप कृपया सत्यापित कर सकते हैं? मेरा मानना ​​है कि आपका कथन केवल तभी सच होगा जब आप इस्तेमाल करते हैंTime.zone.at(1318996912)
BigRon

हाँ, यह सटीक प्रतीत होता है। मेरी स्थानीय मशीन EST पर सेट है और EST में समय प्रदर्शित होता है।
वाट्सइनबॉक्‍स

क्या आप एक उदाहरण प्रदान कर सकते हैं जहां यह मामला नहीं है @BigRon? क्या समय क्षेत्र, रूबी संस्करण, आदि इस तरह से व्यवहार नहीं करता है?
वाट्सइनबॉक्‍स

10

एक समय के लिए यूनिक्स प्रारूप में तारीख बदलने और फिर स्ट्रिंग करने के लिए एक कमांड

    DateTime.strptime(Time.now.utc.to_i.to_s,'%s').strftime("%d %m %y")

    Time.now.utc.to_i #Converts time from Unix format
    DateTime.strptime(Time.now.utc.to_i.to_s,'%s') #Converts date and time from unix format to DateTime

आखिरकार स्ट्रैफ़ाइम का उपयोग दिनांक को प्रारूपित करने के लिए किया जाता है

उदाहरण:

    irb(main):034:0> DateTime.strptime("1410321600",'%s').strftime("%d %m %y")
    "10 09 14"

एक बात ध्यान देने योग्य है कि युग के प्रारूप में एक टाइमज़ोन नहीं होता है इसलिए in_i को chaining से पहले utning को चेस करना आवश्यक नहीं है Time.now.utc.to_i
ट्रेवर मैककलैंड

1

यह आपको भविष्य में सेकंड की संख्या बताता है जिस क्षण से आप कोड निष्पादित करते हैं।

time = Time.new + 1000000000 #date in 1 billion seconds

कहते हैं (समय)

वर्तमान समय के अनुसार मैं इस प्रश्न का उत्तर दे रहा हूँ 047-05-14 05:16:16 +0000(भविष्य में 1 बिलियन सेकंड)

या यदि आप किसी विशेष समय से अरब सेकंड गिनना चाहते हैं, तो यह प्रारूप में है Time.mktime(year, month,date,hours,minutes)

time = Time.mktime(1987,8,18,6,45) + 1000000000

डालता है ("मैं 1 बिलियन सेकंड पुराना होगा:" + समय)


0

यदि आप सिर्फ एक तारीख चाहते थे, तो आप ऐसा कर सकते हैं Date.strptime(invoice.date.to_s, '%s')जहां invoice.dateएक के रूप में आता है Fixnumऔर फिर एक में परिवर्तित हो जाता है String


3
Time.at(1500923406).to_date.to_s=>"2017-07-24"
क्लो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.