代码之家  ›  专栏  ›  技术社区  ›  Igor

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

  •  2
  • Igor  · 技术社区  · 15 年前

    用Perl获取ddmmyy格式的文件修改日期的最佳方法是什么?

    (最初的问题是“如何在不使用datetime模块的情况下进行”。为了使问题更一般化,我取消了这个限制。)

    5 回复  |  直到 8 年前
        1
  •  17
  •   brian d foy    15 年前

    如果这是我唯一需要做的日期格式,并且不需要任何其他日期功能,那么我只使用POSIX(与Perl一起提供):

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

    忘记 -M 如果你不使用相对时间。直接去 stat 以获得新纪元时间。

        2
  •  11
  •   Беров    8 年前

    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("")'
    
        3
  •  4
  •   Community Radu Dragan    7 年前

    下面是一个使用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
  •  4
  •   ysth    15 年前

    更新 :请注意,这个答案是针对原始问题的,它专门排除了使用日期时间模块的情况。

    获取修改时间

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

    这将返回自epoch以来的最后一次修改时间(秒)。

    然后,要转换为日期组件,请使用localtime-

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

    请注意,localtime返回0表示1月,1表示2月等,而$year是自1900年以来的年数,因此109->2009年。

    然后以ddmmyy格式输出-

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

    因此,如果可以的话,只使用日期::格式更容易,也更不容易出错。

        5
  •  0
  •   Igor    15 年前
    use Date::Format;
    print time2str("%d%m%y", (stat $filename)[9]);