2014-03-27 88 views
1

我的代碼:越來越分鐘差異對象

use Time::Piece; 
use Time::Seconds; 

my $timespan = $latest_time - $timestamp; 

print $latest_time . "\n"; 
print $timestamp . "\n"; 
print $timespan->minutes; 

其中$ latest_time =時間:: Piece->新;和$ timestamp = Time :: Piece-> strptime();

,我得到的結果:

Thu Mar 27 09:40:19 2014 
Thu Mar 27 09:40:00 2014 
-479.683333333333 

出了什麼問題? $ timespan應該有0分鐘,對嗎? -479從哪裏來?

+1

479.683秒是有點害羞8小時。你在什麼時區? – tobyink

+0

GMT +8。所以這並不假定這兩個對象由於Time :: Piece-> new而處於同一時區; ? – Bahamut

回答

3

再現「錯誤」

出現此問題的原因strptime默認爲UTC,而不是到本地時區。

use strict; 
use warnings; 

use Time::Piece; 

my $now = Time::Piece->new(); 
print $now->strftime(), "\n"; 
my $fmt = "%Y-%m-%d %H:%M:%S"; 

my $nowstr = $now->strftime($fmt); 
my $parsed = Time::Piece->strptime("$nowstr", $fmt); 
print "($nowstr)\n"; 
print $parsed->strftime(), "\n"; 

my $diff = $now - $parsed; 
print $diff->hours, " hours difference\n"; 

輸出:: - 獲取解析倍

Wed, 26 Mar 2014 21:42:08 Pacific Daylight Time 
(2014-03-26 21:42:08) 
Wed, 26 Mar 2014 21:42:08 UTC 
7 hours difference 

一個hackish的溶液這可以在下面的代碼,這需要當前時間,打印出來,然後重新解析,並示出了差來證實閱讀當地現在

,在黑客左右,我發現一個潛在破解這個我的草莓perl的系統上。這是通過呼籲strptime這樣:$now->strptime

my $nowstr = "2014-03-26 21:51:00"; #$now->strftime($fmt); 
my $parsed = $now->strptime("$nowstr", $fmt); #Time::Piece->strptime("$nowstr", $fmt); 
print "($nowstr)\n"; 
print $parsed->strftime(), "\n"; 

my $diff = $now - $parsed; 
print $diff->hours, " hours difference\n"; 

爲此strptime使用我設置的時間實際上確認,我給它一個是當前時間前6分鐘。輸出如下:

Wed, 26 Mar 2014 21:57:00 Pacific Daylight Time 
(2014-03-26 21:51:00) 
Wed, 26 Mar 2014 21:51:00 Pacific Standard Time 
0.1 hours difference 

解析的時間將從$now繼承c_islocal值。 $now只需要用localtime->new()初始化,當然不是gmtime

正如你可以看到一個聲明的DST,而另一個沒有,但日期數學仍然正確完成。我可以通過查看strptime,_mktimenew的來源來弄清楚這個黑客行爲。

希望至少我的代碼重現錯誤將有助於有Time::Piece更多經驗的人,我很樂意有一個更好的解決方案。

+0

在strptime中添加8000時區(GMT + 8)提示來更正時差結果,但當我使用strftime時,顯示的日期時間現在提前8小時。這是爲什麼?反正現在時區問題解決了。我只是好奇strftime的東西 – Bahamut

+0

(Perl 5.10.1)'Time :: Piece-> strptime'給了我當地時間,而不是** UTC ** –

0

當我使用strftime("%H:%M:%S %Z")兩個$latest_time$timestamp他們都表現出相同的時區,但$latest_time - $timestamp運行表明,存在時區的差異爲tobyink指出。這可能是Time :: Piece模塊中的一個錯誤。

因此,看起來Time::Piece->new;獲得當前機器時間,包括時區。

因此,無論我在Time::Piece->new修復時區還是在使用Time::Piece->strptime();修復時區問題時包含時區值。感謝info,tobyink。