2013-03-05 28 views
6

Ví dụ này lấy ngày cơ sở và thêm 7½ giờ, 1 ngày 7½ giờ, 2 ngày 7½ giờ, v.v.Tại sao thêm 6 ngày 7½ giờ đến nửa đêm kết quả là 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"; 
} 

Khi thêm 6 ngày 7½ giờ, kết quả có thêm giờ.

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

Giờ tiết kiệm ánh sáng ban ngày? – TLP

+0

Nếu bạn muốn bỏ qua các thay đổi DST, hãy chuyển múi giờ thành 'floating'. – ikegami

Trả lời

19

Do Thời gian tiết kiệm ánh sáng ban ngày bắt đầu vào ngày 10 tháng 3 năm 2013 ở múi giờ Mỹ/New_York. DateTime đầu tiên thêm $i ngày (để nhận nửa đêm vào ngày 10 tháng 3) và sau đó thêm 450 phút để nhận 8:30 sáng (vì phút sau 1:59 sáng ngày 10 tháng 3 là 3:00 sáng). Thứ tự của các tham số đến add không có ý nghĩa; xem Adding a Duration to a Datetime.

Vì nó thêm ngày & phút riêng biệt (và xử lý các ngày đầu tiên), hiệu quả chỉ xảy ra vào ngày DST thực sự bắt đầu hoặc kết thúc. Nếu bạn muốn có thời gian cụ thể, chỉ cần set trực tiếp thay vì sử dụng add. Hoặc gọi add hai lần, một lần để thêm phút, sau đó lại thêm ngày.

Các vấn đề liên quan