जवाबों:
DateTime.strptime
युग के बाद से सेकंड संभाल सकते हैं। संख्या को एक स्ट्रिंग में परिवर्तित किया जाना चाहिए:
require 'date'
DateTime.strptime("1318996912",'%s')
%Q
।
Time
है कि इसके बजाय आवश्यक है DateTime
। इसलिए उपयोग करें Time.strptime("1318996912345",'%Q').to_f
और आप मिलीसेकंड को संरक्षित रखेंगे, जबकि DateTime.strptime("1318996912345",'%Q').to_f
यह संरक्षित नहीं करता है।
क्षमा करें, श्लेष विफलता का संक्षिप्त क्षण। यहाँ असली जवाब है।
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>
Time.at
outperforms DateTime.strptime
। उत्तरार्द्ध को एक स्ट्रिंग को पार्स करना पड़ता है, जो आमतौर पर सीधे संख्या में लेने की तुलना में बहुत धीमा होता है।
DateTime.strptime
क्योंकि यह हर पुनरावृत्ति को दो नए स्ट्रिंग्स बना रहा है जो बहुत महंगा है। यह सिर्फ स्ट्रिंग नहीं है जैसे @claw ने कहा
समय क्षेत्र से निपटने
मैं सिर्फ स्पष्ट करना चाहता हूं, भले ही इस पर टिप्पणी की गई हो, लेकिन भविष्य के लोग इस बहुत महत्वपूर्ण अंतर को याद नहीं करते हैं।
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>
**** हर तरह से पूरी तरह से गलत नहीं होने के लिए संपादित किया गया ****
**** ने मानदंड जोड़े ****
Time.at(1318996912) == DateTime.strptime("1318996912",'%s')
एक गैर-यूटीसी समयक्षेत्र में प्रयास करें और आप देखेंगे!
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)
एक समय के लिए यूनिक्स प्रारूप में तारीख बदलने और फिर स्ट्रिंग करने के लिए एक कमांड
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"
Time.now.utc.to_i
।
यह आपको भविष्य में सेकंड की संख्या बताता है जिस क्षण से आप कोड निष्पादित करते हैं।
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 बिलियन सेकंड पुराना होगा:" + समय)