2010-02-11 18 views
8

मैं अपनी परियोजना में Boost's datetime library का उपयोग कर रहा हूं। मैं बहुत खुश था जब मुझे पता चला कि इसमें घंटों, दिन, महीनों, वर्षों आदि के लिए समय अवधि का प्रकार है, और वे जो भी आप उन्हें जोड़ रहे हैं उसके आधार पर अपना मूल्य बदलते हैं (यानी तिथि के महीने के महीने में 1 महीने की प्रगति जोड़ना , यह सिर्फ 30 दिन या somesuch नहीं जोड़ता है)। मैं इस संपत्ति दिनों प्रकार के लिए आयोजित सोचा, लेकिन मैं इससे पहले कि मैं यह उत्पादन में डाल दिया यह परीक्षण करने का फैसला ...स्थानीय_डेट_टाइम गणित को बढ़ावा देता है?

local_date_time t1(date(2010, 3, 14), hours(1), easternTime, false); // 1am on DST transition date 

{ 
    CPPUNIT_ASSERT_EQUAL(greg_year(2010), t1.local_time().date().year()); 
    CPPUNIT_ASSERT_EQUAL(greg_month(3), t1.local_time().date().month()); 
    CPPUNIT_ASSERT_EQUAL(greg_day(14), t1.local_time().date().day()); 
    CPPUNIT_ASSERT_EQUAL(1L, t1.local_time().time_of_day().hours()); 
    CPPUNIT_ASSERT_EQUAL(0L, t1.local_time().time_of_day().minutes()); 
    CPPUNIT_ASSERT_EQUAL(0L, t1.local_time().time_of_day().seconds()); 
} 

t1 += days(1); // the time in EST should now be 1am on the 15th 
{ 
    CPPUNIT_ASSERT_EQUAL(greg_year(2010), t1.local_time().date().year()); 
    CPPUNIT_ASSERT_EQUAL(greg_month(3), t1.local_time().date().month()); 
    CPPUNIT_ASSERT_EQUAL(greg_day(15), t1.local_time().date().day()); 
    CPPUNIT_ASSERT_EQUAL(1L, t1.local_time().time_of_day().hours()); // fails, returns 2 
    CPPUNIT_ASSERT_EQUAL(0L, t1.local_time().time_of_day().minutes()); 
    CPPUNIT_ASSERT_EQUAL(0L, t1.local_time().time_of_day().seconds()); 
} 

से ऊपर तुम मेरे CppUnit इकाई परीक्षण देखेंगे। यह संकेत रेखा पर 2 के साथ विफल रहता है, जो कि मैं उम्मीद करता हूं कि अगर दिन() केवल 1 लॉजिकल दिन के बजाय 24 घंटे जोड़े जाते हैं (क्योंकि डीएसटी संक्रमण 2010-03-14 ईएसटी में 23 घंटे लंबा होता है)।

क्या मैं कुछ गलत कर रहा हूं? क्या यह एक बग है? क्या मैंने इस तरह के गणित के संबंध में लाइब्रेरी के डिजाइन लक्ष्य को पूरी तरह गलत समझा? posix_time :: TIME_DURATION टीडी (24, 0 बढ़ावा :::

+0

यह एक महान उदाहरण है कि हमें सभी टेस्ट हार्नेस कोड क्यों लिखना चाहिए - वास्तविकता – slf

उत्तर

5

मुझे लगता है कि समस्या पूछताछ की धारणा में है कि एक दिन क्या है। वह चाहता है कि यह 24 घंटे के बजाय यहां 'डेट' दिन हो, लेकिन यह पूछना उचित बात नहीं है।

यदि स्थानीय समय में काम करना है, तो किसी को असाधारण प्रभाव का सामना करना पड़ता है। उदाहरण के लिए, यदि आप समय-समय पर 1:00 से 2 बजे तक घड़ियों को आगे रखते हैं, तो आपके स्थानीय समय 'ऐड डेट डे' गणना को प्रासंगिक रविवार की सुबह (गैर मौजूद) 1.30 बजे सेट करना चाहिए, तो आप क्या होने की उम्मीद करते हैं?

एक समय गणना को 24 घंटे आगे बढ़ने के लिए मिला - इसे अंतर्निहित यूटीसी समय पर संचालित होना चाहिए।

वर्णन के अनुसार 'एक दिन कूदें' गणना करने के लिए, बूस्ट के दिनांक प्रकार के साथ काम करें, और केवल अंतिम कार्रवाई के रूप में समय-समय पर जोड़ें।

एक महीने आगे बढ़ने में सक्षम होने का व्यवसाय काफी अलग है, क्योंकि, एक दिन के विपरीत, कैलेंडर माह की अवधि के रूप में कोई विशिष्ट अर्थ नहीं होता है। और यह भी परेशानियों का कारण बनता है: यदि आप 31 जनवरी से एक कैलेंडर माह अग्रिम करते हैं, और फिर एक कैलेंडर माह वापस जाएं, तो आप किस तिथि के साथ समाप्त हो जाते हैं?

+0

इसे ऊपर उठाया गया। ओपी की कोर समस्या यह है कि वह स्थानीय समय पर स्थिर गणित की उम्मीद कर रहा है, जब ऐसी कोई चीज मौजूद नहीं है। और 30 दिनों के बारे में ओपी टिप्पणी मजाकिया है, बशर्ते कि ऐसे कई वित्तीय डोमेन हैं जो कुछ चीजों को सरल बनाने के लिए स्पष्ट रूप से 30/360 या भिन्नताओं का उपयोग करते हैं। – sdg

+0

बूस्ट का महीना और साल के प्रकार व्यवहार करते हैं जैसा मैंने वर्णन किया है, और समस्या हल करेंगे और एसडीजी इस बारे में बात कर रहे हैं: http://www.boost.org/doc/libs/1_40_0/doc/html/date_time/gregorian.html#additional_duration_types। मैं केवल उसी दिन से ही उम्मीद करता हूं। समय गणनाओं को यूटीसी समय पर काम नहीं करना पड़ता है ... हालांकि, इसीलिए यह दोनों पीटा (यूटीसी के लिए) और local_date_time (स्थानीय समय के लिए) गणना प्रदान करता है। इसका मतलब यह नहीं है कि आप गलत हैं, लेकिन जब तक आप बूस्ट दस्तावेज़ों के साथ अपनी गलत धारणाओं को स्क्वायर नहीं करते हैं, तब तक मैं आपका जवाब स्वीकार नहीं कर रहा हूं। – rmeador

+0

बूस्ट का महीना और वर्ष प्रकार, दस्तावेज़ों को उद्धृत करने के लिए, दिनों के दिनों के तार्किक प्रतिनिधित्व - वे ग्रेगोरियन :: दिनांक प्रकार से जुड़े हुए हैं। आपके उदाहरण में, आपका प्रकार local_date_time है। अर्थात्, आप तारीखों के एक-दिन-समय-समय पर ग्रैन्युलरिटी के बजाय, समय के निरंतर प्रवाह में रूचि घोषित कर रहे हैं। इसलिए जब आप अपने दिनांक समय परिवर्तक में एक दिन जोड़ते हैं, तो यह एक तिथि अवधि से एक समय अवधि में परिवर्तित हो जाता है - 1 दिन से 24 घंटे तक। बाकी सब कुछ इस से मिलता है। मुझे खेद है, लेकिन मुझे लगता है कि गलत धारणा आपकी है, और कक्षाएं WAD। – willw

0
इसके बजाय date_duration वस्तु दिनों जोड़ने की

, आप एक बढ़ावा posix_time :: TIME_DURATION वस्तु बनाना चाहिए :: और इतने की तरह अपने स्थानीय समय में जोड़ना, , 0, 0); // 24 घंटे, 0 मिनट, सेकंड, नैनो बूस्ट :: local_time :: local_date_time बाद में = अब + td; // यह मानते हुए कि अब आपका प्रारंभिक // local_date_time है, 2010-3-14 // बाद में अब स्थानीय डेट_टाइम ऑब्जेक्ट होगा जो डीएसटी का पूरा खाता लेता है!

+0

से अपेक्षा की तुलना करना यह ओपी की समस्या को हल नहीं करता है। 'T1 + = days (1);' t1 + = time_duration (24, 0, 0, 0) के साथ; 'वही परिणाम देता है। –

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