如何在Perl中以DDMMYY格式获取文件的修改日期?

时间:2009-12-03 13:29:37

标签: perl file datetime date

在Perl中以DDMMYY格式获取文件修改日期的最佳方法是什么?

(最初的问题是“如何在没有DateTime模块的情况下执行此操作”。我删除了此限制,以使问题更加通用。)

5 个答案:

答案 0 :(得分:17)

如果这是我需要做的唯一日期格式,并且不需要任何日期功能,我只使用POSIX(Perl附带):

use POSIX;

my $file = "/etc/passwd";

my $date = POSIX::strftime( 
             "%d%m%y", 
             localtime( 
                 ( stat $file )[9]
                 )
             );

如果您没有使用相对时间,请忘记-M。直接转到stat以获取纪元时间。

答案 1 :(得分:11)

有关面向对象的语法,请参阅Time::Piece。默认情况下,它还在版本5.10和下一个版本中附带Perl。 通常在稍后的某个时刻,您需要更多功能。使用Time :: Piece不会导入localtimegmtime旁边的任何内容。而且你只要说use Time::Piece ();就可以要求它不要导入任何东西。

use Time::Piece;
localtime((stat $filename)[9])->ymd;                # 2000-02-29
localtime((stat $filename)[9])->ymd('');                 # 20000229
localtime((stat $filename)[9])->dmy("");#is what you wanted



$perl -MTime::Piece -e 'print localtime(time)->dmy("")'

答案 2 :(得分:4)

更新:请注意,此答案是针对原始问题,该问题明确排除了使用DateTime模块。

获得修改时间

my $mtime = (stat $filename)[9];

这将返回自纪元以来的最后修改时间(以秒为单位)。

然后,要翻译为日期组件,请使用localtime -

my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);

请注意,localtime为Jan返回0,为Feb返回1等,$ year是自1900年以来的年数,因此109 - > 2009。

然后以DDMMYY格式输出 -

print substr('0'.$mday,-2), substr('0'.($mon+1),-2), substr($year+1900,-2);

如果可以的话,简单地使用Date :: Format会更容易 - 而且更不容易出错。

答案 3 :(得分:4)

这是使用POSIX(这是一个核心模块)和localtime的一个相当简单的方法,以避免弄乱stat返回的详细信息(请参阅Edg's answer了解为什么这是一个痛苦) :

use POSIX qw/strftime/;

my @records;

opendir my $dh, '.' or die "Can't open current directory for reading: $!";

while (my $item = readdir $dh) {
    next unless -f $item && $item !~ m/^\./;
    push @records, [$item, (stat $item)[9]];
}

for my $record (@records) {
    print "File: $record->[0]\n";
    print "Mtime: " . strftime("%d%m%Y", localtime $record->[1]), "\n";
}

答案 4 :(得分:0)

use Date::Format;
print time2str("%d%m%y", (stat $filename)[9]);