再現「錯誤」
出現此問題的原因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
,_mktime
和new
的來源來弄清楚這個黑客行爲。
希望至少我的代碼重現錯誤將有助於有Time::Piece
更多經驗的人,我很樂意有一個更好的解決方案。
479.683秒是有點害羞8小時。你在什麼時區? – tobyink
GMT +8。所以這並不假定這兩個對象由於Time :: Piece-> new而處於同一時區; ? – Bahamut