2014-04-15 13 views
6

Próbuję zrobić podstawowe porównanie dwóch dat w Perlu. Bieżąca data i godzina są prawidłowe, ale odejmowanie daje nieprawidłowe wyniki. Różnica powinna wynosić ~ 24 godzin, ale powraca ~ 13 godzin. Każdy pomysł, dlaczego i jak to naprawić? dzięki.Dlaczego mój kod Time :: Piece daje dziwne wyniki?

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 

Odpowiedz

9

Oba punkty czasowe znajdują się w różnych strefach czasowych. Różnica jest w rzeczywistości poprawna. Widać, że z

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

Więc w zasadzie $then jest czas UTC podczas $now jest cokolwiek stref czasowych środowisko uważa, że ​​jest w. Aby to naprawić, trzeba zdecydować, co chcesz stref czasowych.

+0

że było doskonałe. Dziękuję Ci – user1768233

2

Jak już powiedział DeVadder, to dlatego, że Time::Piece jest domyślnie ustawione na UTC dla analizowanych czasów.

Zakładając, że chcemy wszystko zrobić za pomocą swoich localtime, można rzeczywiście zachęcające przeanalizowane razy, aby odziedziczyć swoją strefę czasową z lokalnych tak:

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"; 

Wyjścia:

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