2014-10-29 41 views
1

我是一個初學perl的人,嘗試使用我的第一個perl腳本將epoch-sconds中的時間信息轉換爲特定的格式。我知道1月份的月份= 0,1900年的月份= 0,來自其他的stackoverflow問題。即使在對它們進行調整之後,我在unix和perl之間也看不到相同的輸出。Perl時間vs Unix日期輸出不一致

這是我試過並得到的。

的Unix:

日期-d @ 915149280

給我:

週四12月31日19點08分00秒美國東部時間1998年

的Perl:

$time = 915149280; 
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($time); 
$year = $year + 1900; 
$mon = $mon + 1; 
print "Formated time = $mday/$mon/$year $hour:$min:$sec $weekday[$wday]\n"; 

給我:

格式化時間= 1/1/1999 0:8:0週五

是否有perl的線什麼錯誤?我該怎麼做才能得到與date命令相同的輸出? (不是格式化部分,但時間)

我不是在尋找所有的領域,只有一年對我很重要。

+4

時區。你關閉了5個小時。 ANYTIME你得到一個時間差的確切時間不同,它幾乎是99.999999%的時區問題 – 2014-10-29 14:32:47

+0

除了時區差異之外,你應該使用帶有「%02d」的'printf'來打印大部分字段。 – 2014-10-29 14:43:35

+0

@KeithThompson:不,他/他應該使用POSIX :: strftime(或其他模塊的strftime)來打印所有字段:) – ysth 2014-10-29 14:51:24

回答

5

我假設你說的是時間差異而不是格式差異,因爲你的Perl代碼甚至不會嘗試複製那種格式。

使用localtime而不是gmtimedate命令默認使用您的本地時間。注意它說「EST」,但gmtime返回UTC,相差5小時。

您還應該考慮使用模塊來處理日期格式。但是這不會阻止當地時間和UTC之間的混淆。

+0

是的,我在談論時差。順便說一句,非常感謝你的解釋。使用本地時間解決了我的問題。正如我所說,這是我的第一個Perl腳本,甚至可能是最後一個腳本。 – Jey 2014-10-29 14:46:20

0

通過使用POSIX模塊中的strftime,可以使此操作變得相當容易。

perl -MPOSIX=strftime -le 'print strftime "%a %b %d %T %Y",localtime(915149280)' 

週四12月31日16點08分00秒1998年

POSIX模塊已經core模塊自1994年以來通過使用一個明確的導入列表,你避免加載,你不500+一些符號要求。

1

Time::Piece已包含在Perl中近七年時間,並會使您的時間和日期代碼更加容易。

use Time::Piece; 

my $then = gmtime(915149280); 
print $then->strftime('%d-%m-%Y %H:%M:%S %a'); # produces 01-01-1999 00:08:00 Fri