रूबी में 13-अंकीय पूर्णांक के रूप में वर्तमान समय कैसे प्राप्त करें?


88

मेरे पास यह jQueryकार्य है जो वर्तमान समय को मिलीसेकंड की संख्या के रूप में लौटाता है क्योंकि युग (1 जनवरी, 1970):

time = new Date().getTime();

क्या रूबी में भी ऐसा करने का कोई तरीका है?

अभी, मैं रूबी का उपयोग कर रहा हूं, Time.now.to_iजो शानदार काम करता है, लेकिन 10-अंकीय पूर्णांक (सेकंड की संख्या) लौटाता है

मुझे मिलीसेकंड की संख्या प्रदर्शित करने के लिए यह कैसे मिल सकता है jQuery?


5
यह "jQuery फ़ंक्शन" नहीं है, यह केवल सादे ECMAScript (जावास्क्रिप्ट) है। शायद यही कारण है कि -1, बिट कठोर हालांकि प्रेरित है।
रॉब

जवाबों:


151
require 'date'

p DateTime.now.strftime('%s') # "1384526946" (seconds)
p DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)

31
रेल उपयोगकर्ताओं के लिए ध्यान दें: strftimeद्वारा प्रदान की गई विधि ActiveSupport::TimeWithZoneमें %sऔर %Qविनिर्देशक शामिल नहीं हैं । आपको विधि DateTimeका उपयोग करके पहले एक सादे रूबी में बदलना होगा to_datetime
लोनन फोस्टर

6
@ LonnonFoster अब यह काम करता है (बस रेल कंसोल में परीक्षण किया गया)।
निकोला स्टोजाकोविक्स

नमस्ते, मैं एक ही काम कैसे कर सकता हूं, लेकिन अभी के लिए नहीं, बल्कि डेट फील्ड से?
तोमर

यहां यह पाया गया: stackoverflow.com/questions/24149463/ruby-strftimeq-broken
Tomer

100

जावास्क्रिप्ट ने gettime()युग के बाद से मिलीसेकंड की संख्या लौटा दी।

रूबी Time.now.to_iयुग के बाद से आपको सेकंड की संख्या देगा। यदि आप इसे बदल देते हैं Time.now.to_f, तो भी आपको कुछ सेकंड मिलते हैं लेकिन एक भिन्नात्मक घटक के साथ। बस गुणा करें कि 1,000 और आपके पास मिलीसेकंड है। फिर #to_iइसे एक पूर्णांक में बदलने के लिए उपयोग करें। और आप के साथ अंत:

(Time.now.to_f * 1000).to_i

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद! इस पूरी बात के लिए अभी भी नया ... पता नहीं है जो वास्तव में सही के रूप में चिह्नित करने के लिए उत्तर ...
Tintin81

1
बस आगे की जानकारी के लिए, Time.nowरूबी से Time.currentआता है जब से रेल से आता है। इस प्रकार Time.currentरेल एप्लिकेशन टाइमज़ोन द्वारा स्वीकार किया जाता है और Time.nowसर्वर टाइमज़ोन का उपयोग कर रहा है। मेरे अनुभव में, Time.currentसमय-समय पर निरंतरता के लिए अपने रेल आवेदन पर प्रयोग करें
वूट्रान

1
नहीं, आपको Time.currentयहां बिल्कुल भी उपयोग नहीं करना चाहिए , इसे बनाने में अधिक समय लगता है, और चूंकि आप इसे तुरंत एक यूनिक्स टाइमस्टैम्प में परिवर्तित कर रहे हैं, आप समय क्षेत्र स्थिरता के बारे में बिल्कुल भी परवाह नहीं करते हैं। (यूनिक्स टाइमस्टैम्प हमेशा यूटीसी से संबंधित होते हैं)। इसलिए, जब आप कह रहे हैं कि 99% मामलों में यह सच है, यह एक प्रदर्शन-वार अंतिम 1% में आता है।
पेल्मिस्टर

1
यह मेरा पसंदीदा तरीका है। एक चीज जो मुझे करना पसंद है वह है एक :epochविधि जोड़ने के लिए टाइम क्लास बढ़ाना: क्लास टाइम डीप एपोक (self.to_i * 1000) .to_i एंड एंड
मैट


31

(Time.now.to_f * 1000).to_i एक ही काम करना चाहिए।


1
@brauliobo नकली मिलीसेकंड क्या है?
एरिक रोथॉफ

1
@brauliobo यह नहीं करता है, क्योंकि to_fएक दशमलव के रूप में मिलीसेकंड शामिल है।
CashIsClay

20

उपयोग करके strftime, आप सेकंड की संख्या प्राप्त कर सकते हैं और आंशिक मिलिसेकंड (या यदि आवश्यक हो तो छोटी इकाइयां) जोड़ सकते हैं:

2.2.2 :001 > t = Time.new
 => 2015-06-02 12:16:56 -0700 
2.2.2 :002 > t.strftime('%s%3N')
 => "1433272616888" 

ध्यान दें कि यह गोल नहीं है, यह छोटा है, जैसा कि आप देख सकते हैं to_fया यदि आप माइक्रोसेकंड के लिए बाहर जाते हैं:

2.2.2 :003 > t.to_f
 => 1433272616.888615
2.2.2 :004 > t.usec
 => 888615 

और to_f/ to_iसमाधान में एक ही समस्या है:

2.2.2 :009 > (t.to_f * 1000).to_i
 => 1433272616888

इसलिए यदि आप वास्तव में मिलीसेकंड सटीकता के बारे में परवाह करते हैं, तो बेहतर शर्त यह हो सकती to_fहै round:

2.2.2 :010 > (t.to_f * 1000).round
 => 1433272616889

यही कारण है, ने कहा कि के रूप में किए गए दस्तावेज़ों में बताया गया है , "आईईईई 754 डबल नहीं सटीक पर्याप्त युग के बाद से नैनोसेकंड की संख्या का प्रतिनिधित्व करने के लिए है" इसलिए यदि आप वास्तव में वास्तव में परवाह, पर विचार to_rकरने के बजाय to_f-

2.2.2 :011 > (t.to_r * 1000).round
 => 1433272616889 

- यद्यपि यदि आप केवल मिलीसेकंड के लिए चक्कर लगा रहे हैं तो आप शायद ठीक हैं।


18

सावधान रहें, भ्रमित न हों। तथ्य यह है कि रूबी आंशिक सेकंड के विचार का समर्थन करती है क्योंकि फ्लोट वास्तव में इसे फ्लोटिंग पॉइंट नंबर नहीं बनाता है। मुझे इस बात से परेशानी हुई जब मैं पाइथॉन में विंडशार्क टाइमस्टैम्प समय की तुलना कर रहा था ... pcap-ng में समय की गणना अभी काम नहीं कर रही थी। यह केवल तभी था जब मैंने दो हिस्सों (अभिन्न सेकंड और अभिन्न नैनोसेकंड) का इलाज किया क्योंकि दोनों पूर्णांक मैं उचित संख्या प्राप्त करने में सक्षम थे।

ऐसा इसलिए है क्योंकि फ्लोटिंग पॉइंट नंबरों में एक्यूरेसी की समस्या है । वास्तव में, रूबी का एक त्वरित सांग आपको दिखाएगा कि to_f बराबर नहीं है, कहते हैं, nsec:

irb(main):019:0> t=Time.now
=> 2015-04-10 16:41:35 -0500
irb(main):020:0> puts "#{t.to_f}; #{t.nsec}"
1428702095.1435847; 143584844

कैवेट प्रोग्रामर। आप 3 महत्वपूर्ण अंकों के लिए सुरक्षित हो सकते हैं, लेकिन तथ्य यह है: कंप्यूटर पर फ्लोटिंग पॉइंट नंबर सन्निकटन हैं। आधुनिक कंप्यूटर पर नैनोसेकंड काउंटर पूर्णांक हैं।


बेहतर प्रतिक्रिया। धन्यवाद। निर्देशात्मक प्रारूप का .strftime("%9N")भी उपयोग किया जा सकता है। रूबी-doc.org/core-2.3.1/Time.html#method-i-strftime
rplaurindo

13

एक हो जाओ समय के साथ वस्तु Time.now, बुला #to_iरिटर्न एक यूनिक्स टाइमस्टैम्प (युग से सेकंड)। #to_fआंशिक सेकंड देता है जिसे आप युगों से मिलीसेकंड प्राप्त करने के लिए उपयोग कर सकते हैं:

Time.now.to_f * 1000


0

टाइपकास्ट Integer (1e6 * Time.now.to_f) एक Bignum देता है जो मिलीसेकंड पकड़ सकता है

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