2011-08-16 12 views
5

मुझे एक दूसरे से दो डेटाटाइम ऑब्जेक्ट्स घटाकर थोड़ा सा समस्या मिली है। मैं निम्नलिखित कोड का उपयोग करें:पर्ल डेटाटाइम घटाव समस्या


    $today = DateTime->now(time_zone => 'Europe/Berlin'); 

    my $dt1 = DateTime-> new (
        year => 2011, 
        month => 08, 
        day => 08, 
        hour => 1, 
        minute => 0, 
        second => 4, 
        time_zone =>'Europe/Berlin' 
        ); 

    print "DT1 : $dt1\n"; 
    print "today: $today\n"; 

    my $sub = $today->subtract_datetime($dt1); 

    print "sub days: ".$sub->days."\n"; 

DT1 और आज प्रिंट के लिए प्रिंट बयान:

DT1 : 2011-08-08T01:00:04 
today: 2011-08-16T08:34:10 

लेकिन अगर मैं घटाव के बाद प्रिंट $sub->days मूल्य यह 1 के बजाय दिनों से पता चलता ।

क्या मुझे अपने घटाव में कोई त्रुटि है?

आपकी मदद के लिए बहुत धन्यवाद।

उत्तर

5

DateTime::Duration आपके (और I) अपेक्षित काम नहीं करता है। $sub के सभी क्षेत्रों की जाँच करें:

DT1 : 2011-08-08T01:00:04 
today: 2011-08-16T09:02:11 
$sub->years: 0 
$sub->months: 0 
$sub->weeks: 1 
$sub->days: 1 
$sub->hours: 8 
$sub->minutes: 2 
$sub->seconds: 7 

दो तिथियों के बीच के अंतर को 1 सप्ताह + 1 दिन, उम्मीद आठ दिन।

यदि आप दिनों में अंतर चाहते हैं, तो $today->delta_days($dt1) आज़माएं। Delta_days() विधि एक अवधि देता है जिसमें केवल (संपादित करें) और सप्ताह शामिल हैं, लेकिन महीनों में नहीं।

+0

हाय एंडर्स, आपकी मदद के लिए बहुत बहुत धन्यवाद। – Stefan

+3

काफी नहीं। 'delta_days' अभी भी सप्ताह और दिन लौटाता है, इसलिए आपको अभी भी' in_units' का उपयोग करने की आवश्यकता है। अंतर यह है कि यह महीनों वापस नहीं करेगा, जिसे दिनों में परिवर्तित नहीं किया जा सकता है। – ikegami

+0

मैंने इसे जांचने के लिए किसी खंड के माध्यम से हल किया है: यदि $ sub-> सप्ताह> 0 तो $ days = $ sub-> सप्ताह * 7 + $ उप-> दिन – Stefan

0

परिणामी अवधि 1 सप्ताह और 1 दिन है। सप्ताह सुरक्षित रूप से दिन में बदला जा सकता है, तो आप का उपयोग कर

$dur->in_units('days') 

ध्यान रखें कि महीनों दिनों में परिवर्तित नहीं किया जा सकता रखें वांछित परिणाम प्राप्त कर सकते हैं, और घटाव महीने के साथ अवधियों उत्पादन कर सकते हैं।

Illegal octal digit '8' at a.pl line 7, at end of line 
Illegal octal digit '8' at a.pl line 8, at end of line 

ड्रॉप आगे शून्य: इस तरह के रूप में, आप वास्तव में

my $dur = $today->delta_days($dt1); 
print "sub days: ".$dur->in_units('days')."\n"; 

पुनश्च — 08 उपयोग करना चाहते हैं एक त्रुटि है।

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