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命令相同的输出? (不是格式化部分,而是时间)
我并不是在寻找所有领域,只有年份对我很重要。
- 时区。您正好要rest5个小时。任何时候您得到的时差都与确切的小时数不同,这几乎是一个时区问题的99.999999%
-
除时区差异外,还应将printf与"%02d"一起使用以打印大多数字段。
-
@KeithThompson:不,他/她应该使用POSIX :: strftime(或其他模块的strftime)来打印所有字段:)
我假设您是在谈论时间差异,而不是格式差异,因为您的Perl代码甚至都没有尝试复制该格式。
使用localtime代替gmtime。 date命令默认使用您的本地时间。请注意,它说" EST",但是gmtime返回UTC,相差5小时。
您还应该考虑使用模块来处理日期格式。但这并不能避免当地时间和UTC之间的混淆。
- 是的,我说的是时差。顺便说一句,非常感谢您的解释。使用本地时间解决了我的问题。如我所说,这是我的第一个perl脚本,甚至可能是最后一个。
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个不需要的符号。