2015-10-31 17 views
7
#!/usr/bin/perl 
use DateTime; 

$a = DateTime->new(year=>1952,month=>10,day=>21); 
$b = DateTime->new(year=>2015,month=>10,day=>31); 

$dif = $b-$a; 

print $dif->years() ." ". $dif->months() ." ". $dif->days(); 
# result: 63 0 3 

Trường hợp nhận được 3 ngày từ đâu? Kỳ vọng của tôi là 63 0 10.Tại sao toán perl DateTime này tạo ra kết quả không mong muốn?

#!/usr/bin/perl 
use DateTime; 

$a = DateTime->new(year=>1952,month=>11,day=>1); 
$b = DateTime->new(year=>2015,month=>10,day=>31); 

$dif = $b-$a; 

print $dif->years() ." ". $dif->months() ." ". $dif->days(); 
# result 62 11 2 

Kỳ vọng của tôi cho điều này là 62 11 31 hoặc hơn.

Tôi đang cố gắng thực hiện một số ngày sinh cơ bản để tính toán độ tuổi. Tháng và năm dường như làm việc như tôi mong đợi nhưng ngày dường như không thể đoán trước. Tôi đã đọc tài liệu CPAN nhưng tôi vẫn không hiểu.

+6

Lưu ý tắt chủ đề: tốt hơn là không nên sử dụng biến $ a và $ b, cuz chúng đặc biệt trong perl – red0ct

Trả lời

11

$dif->years, $diff->months và cụ thể là $diff->days không làm những gì bạn mong đợi. Từ số DateTime::Duration documentation ...

đối tượng này trả về số lượng đơn vị cho trước là sau khi thực hiện chuyển đổi cho bất kỳ đơn vị lớn hơn nào. Đối với ví dụ , ngày đầu tiên được chuyển đổi thành tuần và sau đó phần còn lại là trả lại. Những con số này luôn tích cực.

Dưới đây là những gì mà mỗi phương thức trả về:

$dur->years()  == abs($dur->in_units('years')) 
$dur->months()  == abs(($dur->in_units('months', 'years'))[0]) 
$dur->weeks()  == abs($dur->in_units('weeks')) 
$dur->days()  == abs(($dur->in_units('days', 'weeks'))[0]) 

Nếu bạn thấy khó hiểu này, vì vậy làm I.

gì bạn muốn là in_units.

# 63 0 10 
say join " ", $dif->in_units('years', 'months', 'days'); 
+1

Thú vị. Vì vậy, giả định mặc định trong gói là số tuần được quan tâm. Kết quả mặc định cho ngày là 'mod 7' của những gì bình thường được mong đợi. –

+1

Câu trả lời hay. Tôi thực sự đánh giá cao bạn bolding các tài liệu có liên quan là tốt. –

+0

@JeffY Yeah, DateTime thích các đơn vị độ dài cố định. Các vấn đề về toán ngày được đề cập trong [Cách thức hoạt động của DateTime Math] (https://metacpan.org/pod/DateTime#Datetime-Subtraction). Lịch toán học phức tạp. – Schwern

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