使用File::stat
我们可以获取给定文件的ctime
。我的问题是如何更改ctime
,这意味着从纪元以来的inode更改时间(以秒为单位)到像“2009-08-26 17:28:28”这样的正常时间表示。是否有任何内置或模块可以解决此任务?
答案 0 :(得分:9)
最标准的方法是使用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上),依此类推。
答案 1 :(得分:3)
如果你想要的只是一个人类可读的表示,那么
print scalar localtime stat($filename)->ctime;
将完成这项工作。这会打印“Wed Jun 10 19:25:16 2009
”之类的内容。
但是,您无法影响格式。
如果您想要GMT中的时间,请改为使用“scalar gmtime
”。
答案 2 :(得分:0)
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
答案 3 :(得分:0)
在Time :: localtime perldoc中有一个例子,它使用它的ctime()来做这种事情。
use File::stat;
use Time::localtime;
my $date_string = ctime(stat($file)->ctime);
答案 4 :(得分:0)
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.
答案 5 :(得分:0)
从这里的答案数量可以看出,你有很多选择。我喜欢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 );
答案 6 :(得分:0)
首先,您是否真的使用File::Stat
而不是File::stat
?如果是,如果您有5.8或更高,请切换到File::stat
。
localtime EXPR
localtime
将time函数返回的时间转换为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);