【发布时间】:2016-06-12 20:40:16
【问题描述】:
在 Perl 中以 DDMMYY 格式获取文件修改日期的最佳方法是什么?
(最初的问题是“如何在没有 DateTime 模块的情况下做到这一点”。我删除了这个限制以使问题更笼统。)
【问题讨论】:
-
我找到了我想要的答案,并去掉了“无DateTime模块”的限制,让问题更笼统。
-
...这改变了问题。
在 Perl 中以 DDMMYY 格式获取文件修改日期的最佳方法是什么?
(最初的问题是“如何在没有 DateTime 模块的情况下做到这一点”。我删除了这个限制以使问题更笼统。)
【问题讨论】:
如果这是我唯一需要做的日期格式化并且不需要任何日期功能来处理其他任何事情,我只使用 POSIX(Perl 附带):
use POSIX;
my $file = "/etc/passwd";
my $date = POSIX::strftime(
"%d%m%y",
localtime(
( stat $file )[9]
)
);
如果您不使用相对时间,请忘记 -M。直接去stat获取纪元时间。
【讨论】:
有关面向对象的语法,请参阅Time::Piece。在 5.10 和下一个版本中,它还默认带有 Perl。
通常在稍后的某个时间点,您需要更多功能。使用 Time::Piece 不会导入除 localtime 和 gmtime 之外的任何内容。你也可以通过说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("")'
【讨论】:
这是一个相当简单的方法,使用 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";
}
【讨论】:
更新:请注意,此答案是针对原始问题的,该问题明确排除了对 DateTime 模块的使用。
获取修改时间
my $mtime = (stat $filename)[9];
这将返回自纪元以来的最后修改时间(以秒为单位)。
然后,要转换为日期组件,请使用 localtime -
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
请注意,localtime 为一月返回 0,二月为 1,以此类推,$year 是自 1900 年以来的年数,因此是 109 -> 2009。
然后以DDMMYY格式输出-
print substr('0'.$mday,-2), substr('0'.($mon+1),-2), substr($year+1900,-2);
因此,如果可以的话,简单地使用 Date::Format 会更容易 - 而且更不容易出错。
【讨论】:
use Date::Format;
print time2str("%d%m%y", (stat $filename)[9]);
【讨论】: