2014-04-15 14 views
6

Tôi đang cố gắng so sánh cơ bản hai ngày trong Perl. Ngày giờ hiện tại và thời gian trong quá khứ là chính xác nhưng phép trừ cho kết quả không chính xác. Sự khác biệt phải là ~ 24 giờ nhưng nó trở lại ~ 13 giờ. Bất kỳ ý tưởng tại sao và làm thế nào để sửa chữa nó? cảm ơn.Tại sao Thời gian của tôi :: Mã mảnh cho kết quả lạ?

use Time::Piece; 

my $now = Time::Piece->new; 
my $then = Time::Piece->strptime("2014-04-14 16:30:20", "%Y-%m-%d %H:%M:%S"); 
my $diff = $now - $then; 

print "Current time: $now\n"; 
print "Past time: $then\n"; 
print "Diff in Seconds:", $diff, "\n"; 
print "Pretty Diff:", $diff->pretty, "\n"; 

Results 
------ 
Current time: Tue Apr 15 16:13:39 2014 
Past time: Mon Apr 14 16:30:20 2014 
Diff in Seconds:49399 
Pretty Diff:13 hours, 43 minutes, 19 seconds 

Trả lời

9

Hai timepoint ở các múi giờ khác nhau. Vì vậy, sự khác biệt là trong thực tế chính xác. Bạn có thể thấy rằng với

print $now->tzoffset, "\n"; # 7200 (I am in UTC +2 hence have 7200s offset) 
print $then->tzoffset, "\n"; # 0 

Vì vậy, về cơ bản $then là khoảng thời gian tính theo giờ UTC khi $now là trong bất cứ múi giờ môi trường của bạn nghĩ rằng nó đang ở trong. Để khắc phục điều đó, bạn cần phải quyết định những gì múi giờ bạn muốn.

+0

tuyệt vời đó là nó. cảm ơn bạn – user1768233

2

Như DeVadder đã nêu, đó là vì Time::Piece mặc định là UTC cho thời gian được phân tích cú pháp.

Giả sử bạn muốn tất cả mọi thứ được thực hiện sử dụng của bạn localtime, bạn thực sự có thể khuyến khích các lần phân tích cú pháp kế thừa múi giờ của họ từ địa phương như vậy:

use Time::Piece; 

use strict; 
use warnings; 

my $now = Time::Piece->new; 
my $then = localtime->strptime("2014-04-14 16:30:20", "%Y-%m-%d %H:%M:%S"); 
my $diff = $now - $then; 

print "Current time: $now\n"; 
print "Past time: $then\n"; 
print "Diff in Seconds:", $diff, "\n"; 
print "Pretty Diff:", $diff->pretty, "\n"; 

Đầu ra:

Current time: Tue Apr 15 17:12:08 2014 
Past time: Mon Apr 14 16:30:20 2014 
Diff in Seconds:88908 
Pretty Diff:1 days, 0 hours, 41 minutes, 48 seconds 
Các vấn đề liên quan