Как я могу получить дату изменения файла в формате DDMMYY в Perl? - PullRequest
2 голосов
/ 03 декабря 2009

Как лучше всего получить дату изменения файла в формате DDMMYY в Perl?

(Первоначально вопрос был "Как это сделать без модуля DateTime". Я снял это ограничение, чтобы сделать вопрос более общим.)

Ответы [ 5 ]

17 голосов
/ 03 декабря 2009

Если это единственное форматирование даты, которое мне нужно сделать, и мне не нужны никакие функции для даты, я просто использую POSIX (который поставляется с Perl):

use POSIX;

my $file = "/etc/passwd";

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

Забудьте о -M, если вы не используете относительное время. Перейдите прямо к stat, чтобы узнать время эпохи.

11 голосов
/ 03 декабря 2009

См. Time :: Piece для объектно-ориентированного синтаксиса. Он также поставляется с Perl по умолчанию в версиях 5.10 и последующих. Обычно на более позднем этапе вам нужно больше функциональности. Использование 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("")'
4 голосов
/ 03 декабря 2009

Вот довольно простой метод, использующий POSIX (который является основным модулем) и localtime, чтобы избежать путаницы с деталями того, что возвращает stat (см. Ответ Эдга , почему это так сложно):

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 голосов
/ 03 декабря 2009

ОБНОВЛЕНИЕ : обратите внимание, что этот ответ был на оригинальный вопрос, который специально исключал использование модулей DateTime.

Чтобы получить модифицированное время

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

Возвращает время последнего изменения в секундах с начала эпохи.

Затем, чтобы перевести на дату компоненты, используйте местное время -

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, если вы можете.

0 голосов
/ 03 декабря 2009
use Date::Format;
print time2str("%d%m%y", (stat $filename)[9]);
...