2016-02-29 8 views
5

आज 2 9 फरवरी है: जिस दिन हमारे परीक्षण टूट गए।रेल्स टाइमविथज़ोन और लीप साल

हमारे परीक्षण विफल हो रहे हैं क्योंकि ये परीक्षण ऐसी चीजें करते हैं जो अंत में, इस तरह की कमांड से तुलना की जा सकती हैं: Time.zone.now - 1.year + 1.year। और यह Time.zone.now के बराबर होता है।

ऐसा क्यों होता है? ActiveSupport इस तरह की गणना में लीप वर्षों को संभालने में सक्षम क्यों नहीं है? क्या यह टाइमस्टैम्प के साथ काम नहीं करता है, जो इस तरह की समस्या को होने से रोक देगा?

+0

आप आज यह परीक्षण कर रहे हैं, तो आप एक बुरी किस्मत ... आज फरवरी, जो केवल हर 4 साल से मौजूद है की 29 है। तो 'Time.zone.now' +' 1. वर्ष 'आपको 28 फरवरी तक ले जाएगा क्योंकि 2 9वीं वर्ष 2017 के लिए मौजूद नहीं है। '1.year.from_now' 28 फरवरी को वापस लौटाएगा 2017 – MrYoshiji

+0

हां मैं समझता हूं। लेकिन उदाहरण के लिए 1 मार्च के बराबर 'Time.zone.now + 1.year' क्यों नहीं है? मेरी राय में यह अधिक उपयुक्त होगा। – Guilherme

+1

Time.zone.now - 365.days + 365.days हालांकि काम करता है ... – tobmatth

उत्तर

0

आप उसी प्रभाव के लिए 1 के बजाय 4 साल का उपयोग कर सकते हैं। (नोट: - 1.day क्योंकि यह 1st मार्च अभी है)

(Time.zone.now - 1.day) - 4.year + 4.year 
=> Mon, 29 Feb 2016 15:12:58 UTC +00:00 

ऐसा नहीं है कि (नीचे) ध्यान देने योग्य हो सकता है, किसी भी तिथि में।

Time.zone.now 
=> Tue, 01 Mar 2016 15:11:51 UTC +00:00 
Time.zone.now == Time.zone.now - 1.year + 1.year 
=> false 

जब तक आप beginning_of_day का उपयोग करें:

(Time.zone.now - 1.day).beginning_of_day == ((Time.zone.now - 1.day) - 4.year + 4.year).beginning_of_day 
=> true 

इसके अलावा, यह निर्भर करता है कि आप वास्तव में क्या करने के लिए ... कोशिश कर रहे हैं तुम क्यों Time.now - 1.year + 1.year का परीक्षण करना चाहते हैं?

भी ...

1.year == 365.days 
=> false 
1.year == 365.25.days 
=> true 
+0

'Time.zone.now == Time.zone.now - 1. प्रिय + 1. प्रिय 'कभी काम नहीं करेगा, आपको अवश्य ही एक चर में 'Time.zone.now' स्टोर करें। – Guilherme

+0

हां, सच है, लेकिन यह तिथि के लिए काम करता है: 'date.today == Date.today - 1. प्रिय + 1. वर्ष' – Jaliso

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