2013-03-05 5 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分30秒を追加すると、結果に余分な時間が含まれます。

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

DSTの変更を無視する場合は、タイムゾーンを「フローティング」に切り替えます。 – ikegami

答えて

19

夏時間が2013年3月10日からAmerica/New_Yorkタイムゾーンで開始されるためです。 DateTimeは最初に$i日(3月10日の深夜)を追加し、450分を追加して8:30 AMになります(3月10日の午前1時59分が午前3時です)。 addへのパラメータの順序は意味がありません。 Adding a Duration to a Datetimeを参照してください。

&分を別々に追加して(最初に日数を処理するため)、DSTが実際に開始または終了する日にのみ効果が発生します。特定の時間が必要な場合は、addの代わりにsetを直接使用してください。またはaddを2回、1回分を追加してからもう一度追加してください。

関連する問題