【问题标题】:How can I get a file's modification date in DDMMYY format in Perl?如何在 Perl 中以 DDMMYY 格式获取文件的修改日期?
【发布时间】:2016-06-12 20:40:16
【问题描述】:

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

(最初的问题是“如何在没有 DateTime 模块的情况下做到这一点”。我删除了这个限制以使问题更笼统。)

【问题讨论】:

  • 我找到了我想要的答案,并去掉了“无DateTime模块”的限制,让问题更笼统。
  • ...这改变了问题。

标签: perl file datetime date


【解决方案1】:

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

use POSIX;

my $file = "/etc/passwd";

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

如果您不使用相对时间,请忘记 -M。直接去stat获取纪元时间。

【讨论】:

  • Stat() 似乎不适用于 Windows Server 2012 上的 Activestate Perl 5.24。如何获取 Windows Server 上文件的文件日期?
  • 查看 Win32:: 模块,了解 Windows 文件系统。
  • 谢谢。我已经在 Activestate 社区论坛 DuckDuckGo 上进行了搜索,并在 Win32::File 上查看了 CPAN。有些模块已经 10 年没有更新了。但是我还没有找到我需要的东西。
【解决方案2】:

有关面向对象的语法,请参阅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("")'

【讨论】:

  • 它是 5.10 的核心,这可能是相关的(因为模块在这里可能是一个问题)。
【解决方案3】:

这是一个相当简单的方法,使用 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】:

    更新:请注意,此答案是针对原始问题的,该问题明确排除了对 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 会更容易 - 而且更不容易出错。

    【讨论】:

    • POSIX::strftime('%m%d%y', $mtime) 也更容易且不易出错
    【解决方案5】:
    use Date::Format;
    print time2str("%d%m%y", (stat $filename)[9]);
    

    【讨论】:

    • 不支持或未安装?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多