如何将ctime更改为正常的字符串表示?

时间:2009-08-26 09:29:45

标签: perl

使用File::stat我们可以获取给定文件的ctime。我的问题是如何更改ctime,这意味着从纪元以来的inode更改时间(以秒为单位)到像“2009-08-26 17:28:28”这样的正常时间表示。是否有任何内置或模块可以解决此任务?

7 个答案:

答案 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”。

这是标量上下文中localtimegmtime的特殊行为。

答案 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

perldoc localtime

  
      
  • 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);