Как изменить ctime на обычное строковое представление? - PullRequest
3 голосов
/ 26 августа 2009

Используя File::stat, мы можем получить ctime данного файла. Мой вопрос заключается в том, как изменить ctime, что означает время смены инода в секундах с начала эпохи, до нормального представления времени, например "2009-08-26 17:28:28". Есть ли встроенный модуль или модуль, способный решить эту задачу?

Ответы [ 7 ]

9 голосов
/ 26 августа 2009

Самый стандартный способ - использовать модуль POSIX и его функцию strftime.

use POSIX qw( strftime );
use File::stat;

my $stat_epoch = stat( 'some_file.name' )->ctime;
print strftime('%Y-%m-%d %H:%M:%S', localtime( $stat_epoch ) );

Все эти маркеры, такие как% Y,% m и т. Д., Определены в стандарте и работают одинаково в C, системной команде «дата» (по крайней мере, в Unix) и т. Д.

3 голосов
/ 26 августа 2009

Если все, что вам нужно, - это удобочитаемое представление, тогда

print scalar localtime stat($filename)->ctime;

сделает работу. Это печатает что-то вроде "Wed Jun 10 19:25:16 2009". Вы не можете влиять на формат, хотя. Если вы хотите указать время по Гринвичу, используйте "scalar gmtime".

Это специальное поведение localtime и gmtime в скалярном контексте.

0 голосов
/ 26 августа 2009

Во-первых, вы действительно используете File::Stat вместо File::stat? Если это так, и если у вас есть 5.8 или выше, переключитесь на File::stat.

perldoc localtime

  • localtime EXPR
  • localtime

    Преобразует время, возвращаемое функцией времени, в список из 9 элементов с временем, проанализированным для местного часового пояса.

...

В скалярном контексте localtime() возвращает значение ctime(3):

Как только вы поймете, что localtime может принять аргумент, ваш разум откроет все другие возможности, упомянутые в этой теме.

#!/usr/bin/perl

use strict;
use warnings;

use File::stat;

my $stat = stat 't.pl';

print "$_\n" for $stat->ctime, scalar localtime($stat->ctime);
0 голосов
/ 26 августа 2009

Как видно по количеству ответов, у вас есть много вариантов. Мне нравится модуль Date::Format:

#!/usr/bin/perl
use strict;
use warnings;

use Date::Format;
use File::Stat;

my $fs = File::Stat->new( '.vimrc' );
my $mtime = $fs->ctime();
print time2str( "changed in %Y on %B, %o at %T\n", $mtime );
0 голосов
/ 26 августа 2009
use File::stat;
use Time::CTime;

$file = "BLAH BLAH BLAH";

$st = stat($file) or die "No $file: $!";
print strftime('%b %o', localtime($st->ctime));

#Feb 11th, for example.
0 голосов
/ 26 августа 2009

В Time :: localtime perldoc есть пример использования ctime () для подобных вещей.

use File::stat;
use Time::localtime;

my $date_string = ctime(stat($file)->ctime);
0 голосов
/ 26 августа 2009
use DateTime;
$dt = DateTime->from_epoch( epoch => $epoch );

Затем объект datetime содержит требуемые представления, например, $year = $dt->year; и т. Д. В скалярном контексте вы получаете хорошее читабельное представление, например,

$epoch = 123456789;
$dt = DateTime->from_epoch( epoch => $epoch );
print $dt;

1973-11-29T21:33:09
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...