2013-03-05 1 views
6

यह उदाहरण आधार दिनांक लेता है और 7½ घंटे, 1 दिन 7½ घंटे, 2 दिन 7½ घंटे, और इसी तरह जोड़ता है।मध्यरात्रि में 6 दिन 7½ घंटे क्यों जोड़ते हैं परिणाम 8:30 में?

use Date::Manip; 
use DateTime; 
use DateTime::Format::DateManip; 

Date::Manip::Date_Init("TZ=America/New_York", "Language=English"); 

my $otime = DateTime->new(
    year  => 2013, 
    month  => 3, 
    day  => 4, 
    hour  => 0, 
    minute => 0, 
    second => 0, 
    time_zone => 'America/New_York', 
); 

my $t1 = UnixDate($otime, "%i:%M %p on %A, %B %e, %Y "); 
print "original $t1\n"; 

for (my $i = 0; $i <= 20; $i++) {    
    my $dtw = $otime->clone(); 
    $dtw->add(
     minutes => (15) * 30, 
     days => ($i), 
    ); 
    $t1 = UnixDate($dtw, "%i:%M %p on %A, %B %e, %Y "); 
    print "$i days $t1\n"; 
} 

6 दिन 7½ घंटे जोड़ते समय, परिणाम में एक अतिरिक्त घंटा होता है।

original 12:00 AM on Monday, March 04, 2013 
0 days 07:30 AM on Monday, March 04, 2013 
1 days 07:30 AM on Tuesday, March 05, 2013 
2 days 07:30 AM on Wednesday, March 06, 2013 
3 days 07:30 AM on Thursday, March 07, 2013 
4 days 07:30 AM on Friday, March 08, 2013 
5 days 07:30 AM on Saturday, March 09, 2013 
6 days 08:30 AM on Sunday, March 10, 2013 # why 8:30 and not 7:30? 
7 days 07:30 AM on Monday, March 11, 2013 
8 days 07:30 AM on Tuesday, March 12, 2013 
9 days 07:30 AM on Wednesday, March 13, 2013 
10 days 07:30 AM on Thursday, March 14, 2013 
11 days 07:30 AM on Friday, March 15, 2013 
12 days 07:30 AM on Saturday, March 16, 2013 
13 days 07:30 AM on Sunday, March 17, 2013 
14 days 07:30 AM on Monday, March 18, 2013 
15 days 07:30 AM on Tuesday, March 19, 2013 
16 days 07:30 AM on Wednesday, March 20, 2013 
17 days 07:30 AM on Thursday, March 21, 2013 
18 days 07:30 AM on Friday, March 22, 2013 
19 days 07:30 AM on Saturday, March 23, 2013 
20 days 07:30 AM on Sunday, March 24, 2013
+5

डेलाइट बचत समय? – TLP

+0

यदि आप डीएसटी परिवर्तनों को अनदेखा करना चाहते हैं, तो समय क्षेत्र को 'फ़्लोटिंग' पर स्विच करें। – ikegami

उत्तर

19

क्योंकि डेलाइट सेविंग टाइम 10 मार्च, 2013 को अमेरिका/न्यू_योर टाइमज़ोन में शुरू होता है। DateTime पहले $i दिनों (10 मार्च को मध्यरात्रि प्राप्त करने के लिए) जोड़ता है और फिर 8:30 बजे प्राप्त करने के लिए 450 मिनट जोड़ता है (क्योंकि 10 मार्च को 1:59 बजे के बाद का मिनट 3:00 बजे है)। add पर पैरामीटर का क्रम सार्थक नहीं है; Adding a Duration to a Datetime देखें।

क्योंकि यह दिन & मिनट अलग-अलग जोड़ता है (और पहले दिन संसाधित करता है), प्रभाव केवल उस तारीख पर होता है जब डीएसटी वास्तव में शुरू होता है या समाप्त होता है। यदि आप एक विशेष समय चाहते हैं, तो set सीधे add का उपयोग करने के बजाय। या add दो बार कॉल करें, एक बार मिनट जोड़ने के लिए, फिर दिन जोड़ने के लिए।

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