Perl时间与Unix日期输出不一致

Perl time Vs Unix date output inconsistency

我是perl的初学者,并且尝试我的第一个perl脚本将时代信息中的时间信息转换为特定格式。我从其他stackoverflow问题中了解到,Perl中的Jan = 0年和1900 = 0年。即使对它们进行了调整,但在unix和perl之间也看不到相同的输出。

这是我尝试并得到的。

Unix:

date -d @915149280

给我:

1998年EST 12月31日星期四19:08:00

Perl:

1
2
3
4
5
6
$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]\
"
;

给我:

格式化时间= 1/1/1999 0:8:0星期五

perl行中是否有错误?我应该怎么做才能获得与date命令相同的输出? (不是格式化部分,而是时间)

我并不是在寻找所有领域,只有年份对我很重要。


我假设您是在谈论时间差异,而不是格式差异,因为您的Perl代码甚至都没有尝试复制该格式。

使用localtime代替gmtimedate命令默认使用您的本地时间。请注意,它说" EST",但是gmtime返回UTC,相差5小时。

您还应该考虑使用模块来处理日期格式。但这并不能避免当地时间和UTC之间的混淆。


Time :: Piece已包含在Perl中将近七年了,它将使您的时间和日期代码变得更加容易。

1
2
3
4
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

您可以通过使用POSIX模块中的strftime大大简化此操作。

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

1998年12月31日星期四16:08:00

POSIX模块自1994年以来一直是核心模块。通过使用显式导入列表,可以避免加载约500个不需要的符号。