2015-09-16 10 views
14

Time.current अपने पार्स समकक्ष के बराबर क्यों नहीं है?उन दो डेटाटाइम अलग क्यों हैं?

current = Time.current 
# Wed, 16 Sep 2015 17:10:56 CEST +02:00 
parsed = Time.zone.parse('16 Sep 2015 17:10:56') 
# Wed, 16 Sep 2015 17:10:56 CEST +02:00 
current == parsed 
# false <= What ?! 
current.to_i == parsed.to_i 
# true 
Ticket.create(datetime: current) 
# ... 
Ticket.find_by_datetime(parsed) 
# nil <= Why ?! 

मैं वास्तव में एक रूबी ऑन रेल्स आवेदन जहां मैं एक datetime विशेषता है कि, पार्स किया गया है पिछले लाइनों पर दिखाया तरह के आधार पर एक रिकॉर्ड खोजने की कोशिश में यह समस्या आ रही है।

मुझे वास्तव में यह नहीं मिलता है। समय क्षेत्र समान हैं, समय सेकंड के समान ही होते हैं। यहाँ क्या हो रहा है?

इसके अलावा, मुझे एक पार्स किए गए डेटाटाइम के आधार पर रिकॉर्ड कैसे प्राप्त करना चाहिए?

+5

आपके कंप्यूटर घड़ी में शायद उप-सेकंड सटीकता है ;-) (संकेत: 'to_f') – Stefan

+0

धन्यवाद! ठीक है तो पार्स किए गए डेटाटाइम में उप-सेकेंड परिशुद्धता नहीं है। लेकिन फिर डेटाबेस में रिकॉर्ड लाने के लिए मुझे क्या करना चाहिए? –

+1

या तो इसे डेटाबेस में सहेजने से पहले पूरे सेकंड में विशेषता को छोटा करें या पूरे श्रेणी को कवर करने वाली सीमा को पार करें: 'टिकट। कहीं (डेटाटाइम: पार्सड ... पार्सड + 1)' – Stefan

उत्तर

5

सहायता के लिए सभी को धन्यवाद। मुझे आशा है कि आपको कोई फर्क नहीं पड़ता है, लेकिन अंतिम उत्तर के टुकड़े कई उत्तरों में बिखरे हुए हैं, इसलिए मैंने जो कुछ कहा है उस पर मैं अपने स्वयं के प्रश्न निर्माण का उत्तर दूंगा।

इसलिए क्यों तारीखें अलग हैं, यह पार्स किए गए डेटाटाइम में मिली मिलीसेकंड की वजह से है। जैसा कि @ दिमाकुरा ने उल्लेख किया था।

current.to_f #=> 1442417032.6567826 
parsed.to_f #=> 1442417032.0 

फिर जवाब दिया गया कि हम एक ट्रैक किए गए डेटाटाइम के आधार पर टिकट रिकॉर्ड कैसे प्राप्त कर सकते हैं।

सबसे पहले यह जानना महत्वपूर्ण है कि यह केवल PostgreSQL (मेरे मामले) या अन्य डेटाबेस के लिए प्रासंगिक होगा जो वास्तव में मिलीसेकंड स्टोर करते हैं। इसका उल्लेख करने के लिए @ एसजेगर का धन्यवाद।

तो हम पार्स + 1 सेकंड में पार्स से, @Stefan तरह समझाया एक श्रृंखला के लिए क्वेरी करने के लिए है:

Ticket.where(datetime: parsed...parsed+1).first 

और हम टिकट निर्माण पर नियंत्रण है, हम भी पहले मिलीसेकंड परिशुद्धता को दूर कर सकता है डेटाबेस को सहेजना ऐसा करने का एक आसान तरीका प्रदान करने के लिए @ एसजेगर के लिए धन्यवाद।

current = Time.current 
Ticket.create(datetime: current.change(usec: 0)) 

सभी को धन्यवाद!

21

वे एक ही नहीं होना चाहिए:

current.to_f #=> 1442417032.6567826 
parsed.to_f #=> 1442417032.0 

जब पार्स करने के लिए, आप मिलीसेकंड याद आती है।

+1

क्या आप विस्तारित कर सकते हैं कि हम डीबी में एक पार्सड स्ट्रिंग के आधार पर रिकॉर्ड कैसे प्राप्त कर सकते हैं जिसमें मिलीसेकंद परिशुद्धता नहीं है? –

+1

@ जेरेमीएफ। क्या आप 'ticket.datetime.to_f' प्रिंट कर सकते हैं? – dimakura

+0

1442416256.115874 –

3

ऐसा इसलिए है क्योंकि वे बराबर नहीं हैं, वे दूसरे के हिस्सों से अलग हैं। कंसोल में आप जो देखते हैं वह inspect विधि का परिणाम उन तिथियों पर बुलाया जाता है, जो डिफ़ॉल्ट रूप से, किसी भी उप-दूसरे भाग को छोड़ देते हैं।

संबंधित मुद्दे